Re: [patch 4/7] staging: speakup: add send_xchar and tiocmset methods

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Okash Khawaja, on lun. 03 avril 2017 21:21:27 +0100, wrote:
> This adds two methods to spk_synth struct: send_xchar and tiocmset, and
> creates serial and tty implementations for each of them. For serial
> implementation it takes existing code in apollo, audptr and spkout which
> already fits the behaviour of send_xchar and tiocmset. For tty implementation,
> it simply delegates to corresponding methods in tty->ops.
> 
> Rest of the changes simply make use of serial implementation of these two
> functions.
> 
> Signed-off-by: Okash Khawaja <okash.khawaja@xxxxxxxxx>

This is so straight-forward :)

Reviewed-by: Samuel Thibault <samuel.thibault@xxxxxxxxxxxx>

That said, you'll want to split this patch into the part that makes
serialio and existing drivers on the one hand (so that it can be moved
to the top of the series, and already submitted upstream), and the part
that adds tty support, which can be folded into the patch adding tty
support.

Samuel

> Index: linux-staging/drivers/staging/speakup/serialio.c
> ===================================================================
> --- linux-staging.orig/drivers/staging/speakup/serialio.c
> +++ linux-staging/drivers/staging/speakup/serialio.c
> @@ -26,8 +26,13 @@ static const struct old_serial_port *ser
>  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 i
>  	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: linux-staging/drivers/staging/speakup/speakup_apollo.c
> ===================================================================
> --- linux-staging.orig/drivers/staging/speakup/speakup_apollo.c
> +++ linux-staging/drivers/staging/speakup/speakup_apollo.c
> @@ -171,9 +171,8 @@ static void do_catch_up(struct spk_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: linux-staging/drivers/staging/speakup/speakup_audptr.c
> ===================================================================
> --- linux-staging.orig/drivers/staging/speakup/speakup_audptr.c
> +++ linux-staging/drivers/staging/speakup/speakup_audptr.c
> @@ -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: linux-staging/drivers/staging/speakup/speakup_spkout.c
> ===================================================================
> --- linux-staging.orig/drivers/staging/speakup/speakup_spkout.c
> +++ linux-staging/drivers/staging/speakup/speakup_spkout.c
> @@ -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: linux-staging/drivers/staging/speakup/spk_ttyio.c
> ===================================================================
> --- linux-staging.orig/drivers/staging/speakup/spk_ttyio.c
> +++ linux-staging/drivers/staging/speakup/spk_ttyio.c
> @@ -29,8 +29,13 @@ static struct tty_ldisc_ops spk_ttyio_ld
>  };
>  
>  static int spk_ttyio_out(struct spk_synth *in_synth, const char ch);
> +static void spk_ttyio_send_xchar(char ch);
> +static void spk_ttyio_tiocmset(unsigned int set, unsigned int clear);
> +
>  struct spk_io_ops spk_ttyio_ops = {
>  	.synth_out = spk_ttyio_out,
> +	.send_xchar = spk_ttyio_send_xchar,
> +	.tiocmset = spk_ttyio_tiocmset,
>  };
>  EXPORT_SYMBOL_GPL(spk_ttyio_ops);
>  
> @@ -95,6 +100,16 @@ static int spk_ttyio_out(struct spk_synt
>  	return 0;
>  }
>  
> +static void spk_ttyio_send_xchar(char ch)
> +{
> +	speakup_tty->ops->send_xchar(speakup_tty, ch);
> +}
> +
> +static void spk_ttyio_tiocmset(unsigned int set, unsigned int clear)
> +{
> +	speakup_tty->ops->tiocmset(speakup_tty, set, clear);
> +}
> +
>  int spk_ttyio_synth_probe(struct spk_synth *synth)
>  {
>  	int rv = spk_ttyio_initialise_ldisc(synth->ser);
> Index: linux-staging/drivers/staging/speakup/spk_types.h
> ===================================================================
> --- linux-staging.orig/drivers/staging/speakup/spk_types.h
> +++ linux-staging/drivers/staging/speakup/spk_types.h
> @@ -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 {
> 

-- 
Samuel
<S> KK1 a 1 conseil de comment s'attaquer a du code java ou ya plus de 50 classes ? par kel bout ?
<B> le troisième
 -+- #ens-mim en stage -+-
_______________________________________________
Speakup mailing list
Speakup@xxxxxxxxxxxxxxxxx
http://linux-speakup.org/cgi-bin/mailman/listinfo/speakup




[Index of Archives]     [Linux for the Blind]     [Fedora Discussioin]     [Linux Kernel]     [Yosemite News]     [Big List of Linux Books]
  Powered by Linux