From: Domagoj Tršan <domagoj.trsan@xxxxxxxxx> This patch fix various coding style issues. Tested by compilation only. Signed-off-by: Domagoj Trsan <domagoj.trsan@xxxxxxxxx> --- drivers/staging/speakup/buffers.c | 1 - drivers/staging/speakup/i18n.h | 30 ++++++++++++++------- drivers/staging/speakup/keyhelp.c | 7 ++++- drivers/staging/speakup/kobjects.c | 1 + drivers/staging/speakup/main.c | 45 +++++++++++++++++++++++++++++--- drivers/staging/speakup/serialio.c | 2 ++ drivers/staging/speakup/speakup_acntpc.c | 3 +++ drivers/staging/speakup/speakup_audptr.c | 2 ++ drivers/staging/speakup/speakup_decext.c | 1 + drivers/staging/speakup/speakup_decpc.c | 7 +++++ drivers/staging/speakup/speakup_dectlk.c | 2 ++ drivers/staging/speakup/speakup_dtlk.c | 5 ++++ drivers/staging/speakup/speakup_keypc.c | 3 +++ drivers/staging/speakup/speakup_ltlk.c | 1 + drivers/staging/speakup/speakup_soft.c | 3 +++ drivers/staging/speakup/speakup_spkout.c | 1 + drivers/staging/speakup/spk_types.h | 4 +-- drivers/staging/speakup/synth.c | 7 +++++ drivers/staging/speakup/varhandlers.c | 6 ++++- 19 files changed, 113 insertions(+), 18 deletions(-) diff --git a/drivers/staging/speakup/buffers.c b/drivers/staging/speakup/buffers.c index 382973e..d45c8af 100644 --- a/drivers/staging/speakup/buffers.c +++ b/drivers/staging/speakup/buffers.c @@ -101,6 +101,5 @@ EXPORT_SYMBOL_GPL(synth_buffer_peek); void synth_buffer_clear(void) { buff_in = buff_out = synth_buffer; - return; } EXPORT_SYMBOL_GPL(synth_buffer_clear); diff --git a/drivers/staging/speakup/i18n.h b/drivers/staging/speakup/i18n.h index dd338f4..46b8aee 100644 --- a/drivers/staging/speakup/i18n.h +++ b/drivers/staging/speakup/i18n.h @@ -106,19 +106,26 @@ enum msg_index_t { MSG_KEYNAMES_START, MSG_KEYNAME_ESC = MSG_KEYNAMES_START, MSG_KEYNAME_1, MSG_KEYNAME_2, MSG_KEYNAME_3, MSG_KEYNAME_4, - MSG_KEYNAME_5, MSG_KEYNAME_6, MSG_KEYNAME_7, MSG_KEYNAME_8, MSG_KEYNAME_9, + MSG_KEYNAME_5, MSG_KEYNAME_6, MSG_KEYNAME_7, MSG_KEYNAME_8, + MSG_KEYNAME_9, MSG_KEYNAME_0, MSG_KEYNAME_DASH, MSG_KEYNAME_EQUAL, MSG_KEYNAME_BS, MSG_KEYNAME_TAB, - MSG_KEYNAME_Q, MSG_KEYNAME_W, MSG_KEYNAME_E, MSG_KEYNAME_R, MSG_KEYNAME_T, - MSG_KEYNAME_Y, MSG_KEYNAME_U, MSG_KEYNAME_I, MSG_KEYNAME_O, MSG_KEYNAME_P, + MSG_KEYNAME_Q, MSG_KEYNAME_W, MSG_KEYNAME_E, MSG_KEYNAME_R, + MSG_KEYNAME_T, + MSG_KEYNAME_Y, MSG_KEYNAME_U, MSG_KEYNAME_I, MSG_KEYNAME_O, + MSG_KEYNAME_P, MSG_KEYNAME_LEFTBRACE, MSG_KEYNAME_RIGHTBRACE, MSG_KEYNAME_ENTER, MSG_KEYNAME_LEFTCTRL, MSG_KEYNAME_A, - MSG_KEYNAME_S, MSG_KEYNAME_D, MSG_KEYNAME_F, MSG_KEYNAME_G, MSG_KEYNAME_H, + MSG_KEYNAME_S, MSG_KEYNAME_D, MSG_KEYNAME_F, MSG_KEYNAME_G, + MSG_KEYNAME_H, MSG_KEYNAME_J, MSG_KEYNAME_K, MSG_KEYNAME_L, MSG_KEYNAME_SEMICOLON, MSG_KEYNAME_SINGLEQUOTE, MSG_KEYNAME_GRAVE, - MSG_KEYNAME_LEFTSHFT, MSG_KEYNAME_BACKSLASH, MSG_KEYNAME_Z, MSG_KEYNAME_X, - MSG_KEYNAME_C, MSG_KEYNAME_V, MSG_KEYNAME_B, MSG_KEYNAME_N, MSG_KEYNAME_M, - MSG_KEYNAME_COMMA, MSG_KEYNAME_DOT, MSG_KEYNAME_SLASH, MSG_KEYNAME_RIGHTSHFT, + MSG_KEYNAME_LEFTSHFT, MSG_KEYNAME_BACKSLASH, MSG_KEYNAME_Z, + MSG_KEYNAME_X, + MSG_KEYNAME_C, MSG_KEYNAME_V, MSG_KEYNAME_B, MSG_KEYNAME_N, + MSG_KEYNAME_M, + MSG_KEYNAME_COMMA, MSG_KEYNAME_DOT, MSG_KEYNAME_SLASH, + MSG_KEYNAME_RIGHTSHFT, MSG_KEYNAME_KPSTAR, MSG_KEYNAME_LEFTALT, MSG_KEYNAME_SPACE, MSG_KEYNAME_CAPSLOCK, MSG_KEYNAME_F1, MSG_KEYNAME_F2, @@ -144,8 +151,10 @@ enum msg_index_t { MSG_KEYNAME_INS, MSG_KEYNAME_DEL, MSG_KEYNAME_MACRO, MSG_KEYNAME_MUTE, MSG_KEYNAME_VOLDOWN, MSG_KEYNAME_VOLUP, - MSG_KEYNAME_POWER, MSG_KEYNAME_KPEQUAL, MSG_KEYNAME_KPPLUSDASH, MSG_KEYNAME_PAUSE, MSG_KEYNAME_F21, - MSG_KEYNAME_F22, MSG_KEYNAME_F23, MSG_KEYNAME_F24, MSG_KEYNAME_KPCOMMA, MSG_KEYNAME_LEFTMETA, + MSG_KEYNAME_POWER, MSG_KEYNAME_KPEQUAL, MSG_KEYNAME_KPPLUSDASH, + MSG_KEYNAME_PAUSE, MSG_KEYNAME_F21, + MSG_KEYNAME_F22, MSG_KEYNAME_F23, MSG_KEYNAME_F24, MSG_KEYNAME_KPCOMMA, + MSG_KEYNAME_LEFTMETA, MSG_KEYNAME_RIGHTMETA, MSG_KEYNAME_COMPOSE, MSG_KEYNAME_STOP, MSG_KEYNAME_AGAIN, MSG_KEYNAME_PROPS, MSG_KEYNAME_UNDO, MSG_KEYNAME_FRONT, MSG_KEYNAME_COPY, MSG_KEYNAME_OPEN, @@ -180,7 +189,8 @@ enum msg_index_t { MSG_FUNCNAME_CHAR_PHONETIC, MSG_FUNCNAME_CHAR_PREVIOUS, MSG_FUNCNAME_CURSOR_PARK, MSG_FUNCNAME_CUT, MSG_FUNCNAME_EDIT_DELIM, MSG_FUNCNAME_EDIT_EXNUM, - MSG_FUNCNAME_EDIT_MOST, MSG_FUNCNAME_EDIT_REPEATS, MSG_FUNCNAME_EDIT_SOME, + MSG_FUNCNAME_EDIT_MOST, MSG_FUNCNAME_EDIT_REPEATS, + MSG_FUNCNAME_EDIT_SOME, MSG_FUNCNAME_GOTO, MSG_FUNCNAME_GOTO_BOTTOM, MSG_FUNCNAME_GOTO_LEFT, MSG_FUNCNAME_GOTO_RIGHT, MSG_FUNCNAME_GOTO_TOP, MSG_FUNCNAME_HELP, MSG_FUNCNAME_LINE_SAY_CURRENT, MSG_FUNCNAME_LINE_SAY_NEXT, diff --git a/drivers/staging/speakup/keyhelp.c b/drivers/staging/speakup/keyhelp.c index 5091625..9475674 100644 --- a/drivers/staging/speakup/keyhelp.c +++ b/drivers/staging/speakup/keyhelp.c @@ -64,6 +64,7 @@ static void build_key_data(void) u_char *kp, counters[MAXFUNCS], ch, ch1; u_short *p_key = key_data, key; int i, offset = 1; + nstates = (int)(state_tbl[-1]); memset(counters, 0, sizeof(counters)); memset(key_offsets, 0, sizeof(key_offsets)); @@ -112,6 +113,7 @@ static void build_key_data(void) static void say_key(int key) { int i, state = key >> 8; + key &= 0xff; for (i = 0; i < 6; i++) { if (state & masks[i]) @@ -127,9 +129,11 @@ static int help_init(void) char start = SPACE; int i; int num_funcs = MSG_FUNCNAMES_END - MSG_FUNCNAMES_START + 1; -state_tbl = spk_our_keys[0]+SHIFT_TBL_SIZE+2; + + state_tbl = spk_our_keys[0]+SHIFT_TBL_SIZE+2; for (i = 0; i < num_funcs; i++) { char *cur_funcname = spk_msg_get(MSG_FUNCNAMES_START + i); + if (start == *cur_funcname) continue; start = *cur_funcname; @@ -144,6 +148,7 @@ int spk_handle_help(struct vc_data *vc, u_char type, u_char ch, u_short key) char *name; u_char func, *kp; u_short *p_keys, val; + if (letter_offsets[0] == -1) help_init(); if (type == KT_LATIN) { diff --git a/drivers/staging/speakup/kobjects.c b/drivers/staging/speakup/kobjects.c index 2ef7f6f..f3463ad 100644 --- a/drivers/staging/speakup/kobjects.c +++ b/drivers/staging/speakup/kobjects.c @@ -232,6 +232,7 @@ static ssize_t keymap_show(struct kobject *kobj, struct kobj_attribute *attr, u_char *cp1; u_char ch; unsigned long flags; + spin_lock_irqsave(&speakup_info.spinlock, flags); cp1 = spk_key_buf + SHIFT_TBL_SIZE; num_keys = (int)(*cp1); diff --git a/drivers/staging/speakup/main.c b/drivers/staging/speakup/main.c index 0cd3cdb..1cfff16 100644 --- a/drivers/staging/speakup/main.c +++ b/drivers/staging/speakup/main.c @@ -78,7 +78,8 @@ int spk_key_echo, spk_say_word_ctl; int spk_say_ctrl, spk_bell_pos; short spk_punc_mask; int spk_punc_level, spk_reading_punc; -char spk_str_caps_start[MAXVARLEN + 1] = "\0", spk_str_caps_stop[MAXVARLEN + 1] = "\0"; +char spk_str_caps_start[MAXVARLEN + 1] = "\0"; +char spk_str_caps_stop[MAXVARLEN + 1] = "\0"; const struct st_bits_data spk_punc_info[] = { {"none", "", 0}, {"some", "/$%&@", SOME}, @@ -282,6 +283,7 @@ static void bleep(u_short val) }; short freq; int time = spk_bleep_time; + freq = vals[val % 12]; if (val > 11) freq *= (1 << (val / 12)); @@ -305,6 +307,7 @@ static void speakup_shut_up(struct vc_data *vc) static void speech_kill(struct vc_data *vc) { char val = synth->is_alive(synth); + if (val == 0) return; @@ -393,6 +396,7 @@ static void say_attributes(struct vc_data *vc) { int fg = spk_attr & 0x0f; int bg = spk_attr >> 4; + if (fg > 8) { synth_printf("%s ", spk_msg_get(MSG_BRIGHT)); fg -= 8; @@ -426,6 +430,7 @@ static void speak_char(u_char ch) { char *cp = spk_characters[ch]; struct var_t *direct = spk_get_var(DIRECT); + if (direct && direct->u.n.value) { if (IS_CHAR(ch, B_CAP)) { spk_pitch_shift++; @@ -459,6 +464,7 @@ static void speak_char(u_char ch) static u16 get_char(struct vc_data *vc, u16 *pos, u_char *attribs) { u16 ch = ' '; + if (vc && pos) { u16 w = scr_readw(pos); u16 c = w & 0xff; @@ -475,6 +481,7 @@ static u16 get_char(struct vc_data *vc, u16 *pos, u_char *attribs) static void say_char(struct vc_data *vc) { u_short ch; + spk_old_attr = spk_attr; ch = get_char(vc, (u_short *) spk_pos, &spk_attr); if (spk_attr != spk_old_attr) { @@ -489,6 +496,7 @@ static void say_char(struct vc_data *vc) static void say_phonetic_char(struct vc_data *vc) { u_short ch; + spk_old_attr = spk_attr; ch = get_char(vc, (u_short *) spk_pos, &spk_attr); if (isascii(ch) && isalpha(ch)) { @@ -539,6 +547,7 @@ static u_long get_word(struct vc_data *vc) char ch; u_short attr_ch; u_char temp; + spk_old_attr = spk_attr; ch = (char)get_char(vc, (u_short *) tmp_pos, &temp); @@ -582,6 +591,7 @@ static void say_word(struct vc_data *vc) { u_long cnt = get_word(vc); u_short saved_punc_mask = spk_punc_mask; + if (cnt == 0) return; spk_punc_mask = PUNC; @@ -595,6 +605,7 @@ static void say_prev_word(struct vc_data *vc) u_char temp; char ch; u_short edge_said = 0, last_state = 0, state = 0; + spk_parked |= 0x01; if (spk_x == 0) { @@ -647,8 +658,8 @@ static void say_next_word(struct vc_data *vc) u_char temp; char ch; u_short edge_said = 0, last_state = 2, state = 0; - spk_parked |= 0x01; + spk_parked |= 0x01; if (spk_x == vc->vc_cols - 1 && spk_y == vc->vc_rows - 1) { announce_edge(vc, edge_bottom); return; @@ -688,6 +699,7 @@ static void spell_word(struct vc_data *vc) char *cp = buf, *str_cap = spk_str_caps_stop; char *cp1, *last_cap = spk_str_caps_stop; u_char ch; + if (!get_word(vc)) return; while ((ch = (u_char) *cp)) { @@ -746,6 +758,7 @@ static void say_line(struct vc_data *vc) int i = get_line(vc); char *cp; u_short saved_punc_mask = spk_punc_mask; + if (i == 0) { synth_printf("%s\n", spk_msg_get(MSG_BLANK)); return; @@ -792,6 +805,7 @@ static int say_from_to(struct vc_data *vc, u_long from, u_long to, int i = 0; u_char tmp; u_short saved_punc_mask = spk_punc_mask; + spk_old_attr = spk_attr; spk_attr = get_attributes((u_short *) from); while (from < to) { @@ -820,6 +834,7 @@ static void say_line_from_to(struct vc_data *vc, u_long from, u_long to, { 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) if (cursor_track != read_all_mode) @@ -903,6 +918,7 @@ static int get_sentence_buf(struct vc_data *vc, int read_punc) 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) @@ -922,6 +938,7 @@ static void say_screen(struct vc_data *vc) static void speakup_win_say(struct vc_data *vc) { u_long start, end, from, to; + if (win_start < 2) { synth_printf("%s\n", spk_msg_get(MSG_NO_WINDOW)); return; @@ -972,6 +989,7 @@ 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_printf("%s\n", spk_msg_get(MSG_BLANK)); @@ -991,6 +1009,7 @@ static void say_last_char(struct vc_data *vc) { int len = get_line(vc); u_char ch; + spk_parked |= 0x01; if (len == 0) { synth_printf("%s\n", spk_msg_get(MSG_BLANK)); @@ -1015,6 +1034,7 @@ static void say_char_num(struct vc_data *vc) { u_char tmp; u_short ch = get_char(vc, (u_short *) spk_pos, &tmp); + ch &= 0xff; synth_printf(spk_msg_get(MSG_CHAR_INFO), ch, ch); } @@ -1049,6 +1069,7 @@ static void spkup_write(const char *in_buf, int count) static u_char ch = '\0', old_ch = '\0'; static u_short char_type, last_type; int in_count = count; + spk_keydown = 0; while (count--) { if (cursor_track == read_all_mode) { @@ -1126,6 +1147,7 @@ static DEFINE_TIMER(cursor_timer, cursor_done, 0, 0); static void do_handle_shift(struct vc_data *vc, u_char value, char up_flag) { unsigned long flags; + if (synth == NULL || up_flag || spk_killed) return; spin_lock_irqsave(&speakup_info.spinlock, flags); @@ -1156,6 +1178,7 @@ static void do_handle_shift(struct vc_data *vc, u_char value, char up_flag) static void do_handle_latin(struct vc_data *vc, u_char value, char up_flag) { unsigned long flags; + spin_lock_irqsave(&speakup_info.spinlock, flags); if (up_flag) { spk_lastkey = spk_keydown = 0; @@ -1181,6 +1204,7 @@ int spk_set_key_info(const u_char *key_info, u_char *k_buffer) const u_char *cp = key_info; u_char *cp1 = k_buffer; u_char ch, version, num_keys; + version = *cp++; if (version != KEY_MAP_VER) return -1; @@ -1263,6 +1287,7 @@ static const struct st_bits_data *pb_edit; 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) { @@ -1448,6 +1473,7 @@ static void handle_cursor_read_all(struct vc_data *vc, int command) static int pre_handle_cursor(struct vc_data *vc, u_char value, char up_flag) { unsigned long flags; + spin_lock_irqsave(&speakup_info.spinlock, flags); if (cursor_track == read_all_mode) { spk_parked &= 0xfe; @@ -1531,6 +1557,7 @@ static void reset_highlight_buffers(struct vc_data *vc) { int i; int vc_num = vc->vc_num; + for (i = 0; i < 8; i++) speakup_console[vc_num]->ht.highsize[i] = 0; } @@ -1549,6 +1576,7 @@ static int count_highlight_color(struct vc_data *vc) for (i = 0; i < vc->vc_rows; i++) { u16 *end = start + vc->vc_cols * 2; u16 *ptr; + for (ptr = start; ptr < end; ptr++) { ch = get_attributes(ptr); bg = (ch & 0x70) >> 4; @@ -1593,6 +1621,7 @@ static int speak_highlight(struct vc_data *vc) { int hc, d; int vc_num = vc->vc_num; + if (count_highlight_color(vc) == 1) return 0; hc = get_highlight_color(vc); @@ -1617,6 +1646,7 @@ static void cursor_done(u_long data) { struct vc_data *vc = vc_cons[cursor_con].d; unsigned long flags; + del_timer(&cursor_timer); spin_lock_irqsave(&speakup_info.spinlock, flags); if (cursor_con != fg_console) { @@ -1656,6 +1686,7 @@ out: static void speakup_bs(struct vc_data *vc) { unsigned long flags; + if (!speakup_console[vc->vc_num]) return; if (!spin_trylock_irqsave(&speakup_info.spinlock, flags)) @@ -1679,6 +1710,7 @@ static void speakup_bs(struct vc_data *vc) static void speakup_con_write(struct vc_data *vc, const char *str, int len) { unsigned long flags; + if ((vc->vc_num != fg_console) || spk_shut_up || synth == NULL) return; if (!spin_trylock_irqsave(&speakup_info.spinlock, flags)) @@ -1707,6 +1739,7 @@ static void speakup_con_write(struct vc_data *vc, const char *str, int len) static void speakup_con_update(struct vc_data *vc) { unsigned long flags; + if (speakup_console[vc->vc_num] == NULL || spk_parked) return; if (!spin_trylock_irqsave(&speakup_info.spinlock, flags)) @@ -1721,6 +1754,7 @@ static void do_handle_spec(struct vc_data *vc, u_char value, char up_flag) unsigned long flags; int on_off = 2; char *label; + if (synth == NULL || up_flag || spk_killed) return; spin_lock_irqsave(&speakup_info.spinlock, flags); @@ -1762,6 +1796,7 @@ static int inc_dec_var(u_char value) char *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 = spk_get_var_header(var_id); if (p_header == NULL) @@ -1788,6 +1823,7 @@ static int inc_dec_var(u_char value) static void speakup_win_set(struct vc_data *vc) { char info[40]; + if (win_start > 1) { synth_printf("%s\n", spk_msg_get(MSG_WINDOW_ALREADY_SET)); return; @@ -1842,6 +1878,7 @@ static void speakup_win_enable(struct vc_data *vc) static void speakup_bits(struct vc_data *vc) { int val = this_speakup_key - (FIRST_EDIT_BITS - 1); + if (spk_special_handler != NULL || val < 1 || val > 6) { synth_printf("%s\n", spk_msg_get(MSG_ERROR)); return; @@ -1939,7 +1976,6 @@ static void speakup_goto(struct vc_data *vc) } synth_printf("%s\n", spk_msg_get(MSG_GOTO)); spk_special_handler = handle_goto; - return; } static void speakup_help(struct vc_data *vc) @@ -2011,6 +2047,7 @@ speakup_key(struct vc_data *vc, int shift_state, int keycode, u_short keysym, u_char type = KTYP(keysym), value = KVAL(keysym), new_key = 0; u_char shift_info, offset; int ret = 0; + if (synth == NULL) return 0; @@ -2161,6 +2198,7 @@ static int keyboard_notifier_call(struct notifier_block *nb, case KBD_POST_KEYSYM:{ unsigned char type = KTYP(param->value) - 0xf0; unsigned char val = KVAL(param->value); + switch (type) { case KT_SHIFT: do_handle_shift(vc, val, up); @@ -2187,6 +2225,7 @@ static int vt_notifier_call(struct notifier_block *nb, { struct vt_notifier_param *param = _param; struct vc_data *vc = param->vc; + switch (code) { case VT_ALLOCATE: if (vc->vc_mode == KD_TEXT) diff --git a/drivers/staging/speakup/serialio.c b/drivers/staging/speakup/serialio.c index c62d74c..1d9d51b 100644 --- a/drivers/staging/speakup/serialio.c +++ b/drivers/staging/speakup/serialio.c @@ -83,6 +83,7 @@ static irqreturn_t synth_readbuf_handler(int irq, void *dev_id) /*printk(KERN_ERR "in irq\n"); */ /*pr_warn("in IRQ\n"); */ int c; + spin_lock_irqsave(&speakup_info.spinlock, flags); while (inb_p(speakup_info.port_tts + UART_LSR) & UART_LSR_DR) { @@ -137,6 +138,7 @@ void spk_stop_serial_interrupt(void) int spk_wait_for_xmitr(void) { int tmout = SPK_XMITR_TIMEOUT; + if ((synth->alive) && (timeouts >= NUM_DISABLE_TIMEOUTS)) { pr_warn("%s: too many timeouts, deactivating speakup\n", synth->long_name); diff --git a/drivers/staging/speakup/speakup_acntpc.c b/drivers/staging/speakup/speakup_acntpc.c index 31f952b..f0bfd9e 100644 --- a/drivers/staging/speakup/speakup_acntpc.c +++ b/drivers/staging/speakup/speakup_acntpc.c @@ -152,8 +152,10 @@ static inline bool synth_full(void) static const char *synth_immediate(struct spk_synth *synth, const char *buf) { u_char ch; + while ((ch = *buf)) { int timeout = SPK_XMITR_TIMEOUT; + if (ch == '\n') ch = PROCSPEECH; if (synth_full()) @@ -257,6 +259,7 @@ static int synth_probe(struct spk_synth *synth) { unsigned int port_val = 0; int i = 0; + pr_info("Probing for %s.\n", synth->long_name); if (port_forced) { speakup_info.port_tts = port_forced; diff --git a/drivers/staging/speakup/speakup_audptr.c b/drivers/staging/speakup/speakup_audptr.c index 362f974..5cbaec8 100644 --- a/drivers/staging/speakup/speakup_audptr.c +++ b/drivers/staging/speakup/speakup_audptr.c @@ -132,6 +132,7 @@ static struct spk_synth synth_audptr = { static void synth_flush(struct spk_synth *synth) { int timeout = SPK_XMITR_TIMEOUT; + while (spk_serial_tx_busy()) { if (!--timeout) break; @@ -145,6 +146,7 @@ static void synth_version(struct spk_synth *synth) { unsigned char test = 0; char synth_id[40] = ""; + spk_synth_immediate(synth, "\x05[Q]"); synth_id[test] = spk_serial_in(); if (synth_id[test] == 'A') { diff --git a/drivers/staging/speakup/speakup_decext.c b/drivers/staging/speakup/speakup_decext.c index 67b7de1..510ac97 100644 --- a/drivers/staging/speakup/speakup_decext.c +++ b/drivers/staging/speakup/speakup_decext.c @@ -39,6 +39,7 @@ static unsigned char last_char; static inline u_char get_last_char(void) { 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; diff --git a/drivers/staging/speakup/speakup_decpc.c b/drivers/staging/speakup/speakup_decpc.c index 67678d8..693389e 100644 --- a/drivers/staging/speakup/speakup_decpc.c +++ b/drivers/staging/speakup/speakup_decpc.c @@ -260,6 +260,7 @@ static void dt_sendcmd(u_int cmd) static int dt_waitbit(int bit) { int timeout = 100; + while (--timeout > 0) { if ((dt_getstatus() & bit) == bit) return 1; @@ -271,6 +272,7 @@ static int dt_waitbit(int bit) static int dt_wait_dma(void) { int timeout = 100, state = dma_state; + if (!dt_waitbit(STAT_dma_ready)) return 0; while (--timeout > 0) { @@ -285,6 +287,7 @@ static int dt_wait_dma(void) static int dt_ctrl(u_int cmd) { int timeout = 10; + if (!dt_waitbit(STAT_cmd_ready)) return -1; outb_p(0, speakup_info.port_tts+2); @@ -304,6 +307,7 @@ static int dt_ctrl(u_int cmd) static void synth_flush(struct spk_synth *synth) { int timeout = 10; + if (is_flushing) return; is_flushing = 4; @@ -346,6 +350,7 @@ static int dt_sendchar(char ch) static int testkernel(void) { int status = 0; + if (dt_getstatus() == 0xffff) { status = -1; goto oops; @@ -437,6 +442,7 @@ static void do_catch_up(struct spk_synth *synth) static const char *synth_immediate(struct spk_synth *synth, const char *buf) { u_char ch; + while ((ch = *buf)) { if (ch == '\n') ch = PROCSPEECH; @@ -450,6 +456,7 @@ static const char *synth_immediate(struct spk_synth *synth, const char *buf) static int synth_probe(struct spk_synth *synth) { 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)) { diff --git a/drivers/staging/speakup/speakup_dectlk.c b/drivers/staging/speakup/speakup_dectlk.c index c07c967..69e7c2b 100644 --- a/drivers/staging/speakup/speakup_dectlk.c +++ b/drivers/staging/speakup/speakup_dectlk.c @@ -169,6 +169,7 @@ static u_char lastind; static unsigned char get_index(void) { u_char rv; + rv = lastind; lastind = 0; return rv; @@ -180,6 +181,7 @@ static void read_buff_add(u_char c) if (c == 0x01) { unsigned long flags; + spin_lock_irqsave(&flush_lock, flags); is_flushing = 0; wake_up_interruptible(&flush); diff --git a/drivers/staging/speakup/speakup_dtlk.c b/drivers/staging/speakup/speakup_dtlk.c index 98d1f49..d7d5152 100644 --- a/drivers/staging/speakup/speakup_dtlk.c +++ b/drivers/staging/speakup/speakup_dtlk.c @@ -174,6 +174,7 @@ static inline bool synth_full(void) static void spk_out(const char ch) { int timeout = SPK_XMITR_TIMEOUT; + while (!synth_writable()) { if (!--timeout) break; @@ -246,6 +247,7 @@ static void do_catch_up(struct spk_synth *synth) static const char *synth_immediate(struct spk_synth *synth, const char *buf) { u_char ch; + while ((ch = (u_char)*buf)) { if (synth_full()) return buf; @@ -267,6 +269,7 @@ static void synth_flush(struct spk_synth *synth) static char synth_read_tts(void) { u_char ch; + while (!synth_readable()) cpu_relax(); ch = synth_status & 0x7f; @@ -283,6 +286,7 @@ static struct synth_settings *synth_interrogate(struct spk_synth *synth) static char buf[sizeof(struct synth_settings) + 1]; int total, i; static struct synth_settings status; + synth_immediate(synth, "\x18\x01?"); for (total = 0, i = 0; i < 50; i++) { buf[total] = synth_read_tts(); @@ -324,6 +328,7 @@ static int synth_probe(struct spk_synth *synth) unsigned int port_val = 0; int i = 0; struct synth_settings *sp; + pr_info("Probing for DoubleTalk.\n"); if (port_forced) { speakup_info.port_tts = port_forced; diff --git a/drivers/staging/speakup/speakup_keypc.c b/drivers/staging/speakup/speakup_keypc.c index 9d30c19..4ed3889 100644 --- a/drivers/staging/speakup/speakup_keypc.c +++ b/drivers/staging/speakup/speakup_keypc.c @@ -143,6 +143,7 @@ static inline bool synth_full(void) static char *oops(void) { int s1, s2, s3, s4; + s1 = inb_p(synth_port); s2 = inb_p(synth_port+1); s3 = inb_p(synth_port+2); @@ -155,6 +156,7 @@ static const char *synth_immediate(struct spk_synth *synth, const char *buf) { u_char ch; int timeout; + while ((ch = *buf)) { if (ch == '\n') ch = PROCSPEECH; @@ -264,6 +266,7 @@ static int synth_probe(struct spk_synth *synth) { unsigned int port_val = 0; int i = 0; + pr_info("Probing for %s.\n", synth->long_name); if (port_forced) { synth_port = port_forced; diff --git a/drivers/staging/speakup/speakup_ltlk.c b/drivers/staging/speakup/speakup_ltlk.c index d6de722..377a6e2 100644 --- a/drivers/staging/speakup/speakup_ltlk.c +++ b/drivers/staging/speakup/speakup_ltlk.c @@ -141,6 +141,7 @@ static void synth_interrogate(struct spk_synth *synth) { unsigned char *t, i; unsigned char buf[50], rom_v[20]; + spk_synth_immediate(synth, "\x18\x01?"); for (i = 0; i < 50; i++) { buf[i] = spk_serial_in(); diff --git a/drivers/staging/speakup/speakup_soft.c b/drivers/staging/speakup/speakup_soft.c index 9ed7265..e6e93fb 100644 --- a/drivers/staging/speakup/speakup_soft.c +++ b/drivers/staging/speakup/speakup_soft.c @@ -192,6 +192,7 @@ static int softsynth_open(struct inode *inode, struct file *fp) static int softsynth_close(struct inode *inode, struct file *fp) { unsigned long flags; + spin_lock_irqsave(&speakup_info.spinlock, flags); synth_soft.alive = 0; init_pos = 0; @@ -283,6 +284,7 @@ static unsigned int softsynth_poll(struct file *fp, { unsigned long flags; int ret = 0; + poll_wait(fp, &speakup_event, wait); spin_lock_irqsave(&speakup_info.spinlock, flags); @@ -295,6 +297,7 @@ static unsigned int softsynth_poll(struct file *fp, static unsigned char get_index(void) { int rv; + rv = last_index; last_index = 0; return rv; diff --git a/drivers/staging/speakup/speakup_spkout.c b/drivers/staging/speakup/speakup_spkout.c index 77f2dc2..bccddf8 100644 --- a/drivers/staging/speakup/speakup_spkout.c +++ b/drivers/staging/speakup/speakup_spkout.c @@ -131,6 +131,7 @@ static struct spk_synth synth_spkout = { static void synth_flush(struct spk_synth *synth) { int timeout = SPK_XMITR_TIMEOUT; + while (spk_serial_tx_busy()) { if (!--timeout) break; diff --git a/drivers/staging/speakup/spk_types.h b/drivers/staging/speakup/spk_types.h index 3ac552c..8c565c9 100644 --- a/drivers/staging/speakup/spk_types.h +++ b/drivers/staging/speakup/spk_types.h @@ -39,10 +39,10 @@ enum var_id_t { 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, + SAY_CONTROL, SAY_WORD_CTL, NO_INTERRUPT, KEY_ECHO, SPELL_DELAY, PUNC_LEVEL, READING_PUNC, ATTRIB_BLEEP, BLEEPS, - RATE, PITCH, VOL, TONE, PUNCT, VOICE, FREQUENCY, LANG, DIRECT, + RATE, PITCH, VOL, TONE, PUNCT, VOICE, FREQUENCY, LANG, DIRECT, CAPS_START, CAPS_STOP, CHARTAB, MAXVARS }; diff --git a/drivers/staging/speakup/synth.c b/drivers/staging/speakup/synth.c index 172cf62..4c47b6d 100644 --- a/drivers/staging/speakup/synth.c +++ b/drivers/staging/speakup/synth.c @@ -148,6 +148,7 @@ EXPORT_SYMBOL_GPL(spk_do_catch_up); const char *spk_synth_immediate(struct spk_synth *synth, const char *buff) { u_char ch; + while ((ch = *buff)) { if (ch == '\n') ch = synth->procspeech; @@ -259,6 +260,7 @@ static int sentence_count; void spk_reset_index_count(int sc) { static int first = 1; + if (first) first = 0; else @@ -277,6 +279,7 @@ int synth_supports_indexing(void) void synth_insert_next_index(int sent_num) { int out; + if (synth->alive) { if (sent_num == 0) { synth->indexing.currindex++; @@ -295,6 +298,7 @@ void synth_insert_next_index(int sent_num) void spk_get_index_count(int *linecount, int *sentcount) { int ind = synth->get_index(); + if (ind) { sentence_count = ind % 10; @@ -315,6 +319,7 @@ 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; @@ -437,6 +442,7 @@ int synth_add(struct spk_synth *in_synth) { int i; int status = 0; + mutex_lock(&spk_mutex); for (i = 0; i < MAXSYNTHS && synths[i] != NULL; i++) /* synth_remove() is responsible for rotating the array down */ @@ -461,6 +467,7 @@ EXPORT_SYMBOL_GPL(synth_add); void synth_remove(struct spk_synth *in_synth) { int i; + mutex_lock(&spk_mutex); if (synth == in_synth) synth_release(); diff --git a/drivers/staging/speakup/varhandlers.c b/drivers/staging/speakup/varhandlers.c index 445a3fd..d758284 100644 --- a/drivers/staging/speakup/varhandlers.c +++ b/drivers/staging/speakup/varhandlers.c @@ -112,12 +112,12 @@ void speakup_register_var(struct var_t *var) default: break; } - return; } void speakup_unregister_var(enum var_id_t var_id) { struct st_var_header *p_header; + BUG_ON(var_id < 0 || var_id >= MAXVARS); p_header = var_ptrs[var_id]; p_header->data = NULL; @@ -126,6 +126,7 @@ void speakup_unregister_var(enum var_id_t var_id) struct st_var_header *spk_get_var_header(enum var_id_t var_id) { struct st_var_header *p_header; + if (var_id < 0 || var_id >= MAXVARS) return NULL; p_header = var_ptrs[var_id]; @@ -272,6 +273,7 @@ int spk_set_mask_bits(const char *input, const int which, const int how) { u_char *cp; short mask = spk_punc_info[which].mask; + if (how&1) { for (cp = (u_char *)spk_punc_info[3].value; *cp; cp++) spk_chartab[*cp] &= ~mask; @@ -308,6 +310,7 @@ int spk_set_mask_bits(const char *input, const int which, const int how) char *spk_strlwr(char *s) { char *p; + if (s == NULL) return NULL; @@ -319,6 +322,7 @@ char *spk_strlwr(char *s) char *spk_s2uchar(char *start, char *dest) { int val = 0; + val = simple_strtoul(skip_spaces(start), &start, 10); if (*start == ',') start++; -- 1.9.1 _______________________________________________ Speakup mailing list Speakup@xxxxxxxxxxxxxxxxx http://linux-speakup.org/cgi-bin/mailman/listinfo/speakup