staging: speakup: add send_xchar and tiocmset methods
authorOkash Khawaja <okash.khawaja@gmail.com>
Sat, 22 Apr 2017 08:00:28 +0000 (09:00 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 25 Apr 2017 18:45:12 +0000 (20:45 +0200)
This adds two methods to spk_synth struct: send_xchar and tiocmset, and
creates serial implementation for each of them. It takes existing code
in apollo, audptr and spkout which already fits the behaviour of
send_xchar and tiocmset. In follow-up patches there will be TTY-based
implementations of these methods. Then migrating the synths to TTY will
include repointing these methods to their TTY implementations

Rest of the changes simply make use of serial implementation of these two
functions.

Signed-off-by: Okash Khawaja <okash.khawaja@gmail.com>
Reviewed-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/speakup/serialio.c
drivers/staging/speakup/speakup_apollo.c
drivers/staging/speakup/speakup_audptr.c
drivers/staging/speakup/speakup_spkout.c
drivers/staging/speakup/spk_types.h

index 3fab1c377a803b294995f72d4a9d65582f39d22f..ba060d0ceca2f69d3b0dc1cd5f65919fdd2ec204 100644 (file)
@@ -26,8 +26,13 @@ static const struct old_serial_port *serstate;
 static int timeouts;
 
 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);
+
 struct spk_io_ops spk_serial_io_ops = {
        .synth_out = spk_serial_out,
+       .send_xchar = spk_serial_send_xchar,
+       .tiocmset = spk_serial_tiocmset,
 };
 EXPORT_SYMBOL_GPL(spk_serial_io_ops);
 
@@ -136,6 +141,24 @@ static void start_serial_interrupt(int irq)
        outb(1, speakup_info.port_tts + UART_FCR);      /* Turn FIFO On */
 }
 
+static void spk_serial_send_xchar(char ch)
+{
+       int timeout = SPK_XMITR_TIMEOUT;
+
+       while (spk_serial_tx_busy()) {
+               if (!--timeout)
+                       break;
+               udelay(1);
+       }
+       outb(ch, speakup_info.port_tts);
+}
+
+static void spk_serial_tiocmset(unsigned int set, unsigned int clear)
+{
+       int old = inb(speakup_info.port_tts + UART_MCR);
+       outb((old & ~clear) | set, speakup_info.port_tts + UART_MCR);
+}
+
 int spk_serial_synth_probe(struct spk_synth *synth)
 {
        const struct old_serial_port *ser;
index 6ad83dc642c4a9caed5fcbaf68c151feb8096dcb..cead8b1b1bfcc22924f25e747d05deb9d83f1b9a 100644 (file)
@@ -171,9 +171,8 @@ static void do_catch_up(struct spk_synth *synth)
                full_time_val = full_time->u.n.value;
                spin_unlock_irqrestore(&speakup_info.spinlock, flags);
                if (!synth->io_ops->synth_out(synth, ch)) {
-                       outb(UART_MCR_DTR, speakup_info.port_tts + UART_MCR);
-                       outb(UART_MCR_DTR | UART_MCR_RTS,
-                            speakup_info.port_tts + UART_MCR);
+                       synth->io_ops->tiocmset(0, UART_MCR_RTS);
+                       synth->io_ops->tiocmset(UART_MCR_RTS, 0);
                        schedule_timeout(msecs_to_jiffies(full_time_val));
                        continue;
                }
index da3fd94a6ad9023d8cc71e723de37a22fb2ac4de..6880352a7b7418bc0777dd4dd967cf5d30918c9b 100644 (file)
@@ -128,14 +128,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;
-               udelay(1);
-       }
-       outb(SYNTH_CLEAR, speakup_info.port_tts);
+       synth->io_ops->send_xchar(SYNTH_CLEAR);
        synth->io_ops->synth_out(synth, PROCSPEECH);
 }
 
index d08ddc110f5763cc31b88deea77b068ad0a8e43f..d95c375a07369a13045d38d24edb8eef26df2b71 100644 (file)
@@ -126,14 +126,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;
-               udelay(1);
-       }
-       outb(SYNTH_CLEAR, speakup_info.port_tts);
+       synth->io_ops->send_xchar(SYNTH_CLEAR);
 }
 
 module_param_named(ser, synth_spkout.ser, int, 0444);
index a446064b6c91bcfe02d1ab0c91f8e3278eb94b4e..c156975392c8d3142464c78c7026d771fa39e37a 100644 (file)
@@ -150,6 +150,8 @@ struct spk_synth;
 
 struct spk_io_ops {
        int (*synth_out)(struct spk_synth *synth, const char ch);
+       void (*send_xchar)(char ch);
+       void (*tiocmset)(unsigned int set, unsigned int clear);
 };
 
 struct spk_synth {