[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20190503065917.GA26546@localhost>
Date: Fri, 3 May 2019 08:59:17 +0200
From: Johan Hovold <johan@...nel.org>
To: "Ji-Ze Hong (Peter Hong)" <hpeter@...il.com>
Cc: peter_hong@...tek.com.tw, johan@...nel.org,
gregkh@...uxfoundation.org, linux-usb@...r.kernel.org,
linux-kernel@...r.kernel.org,
"Ji-Ze Hong (Peter Hong)" <hpeter+linux_kernel@...il.com>
Subject: Re: [PATCH V9 4/4] USB: serial: f81232: implement break control
On Tue, Apr 30, 2019 at 09:22:32AM +0800, Ji-Ze Hong (Peter Hong) wrote:
> Implement Fintek F81232 break on/off with LCR register.
> It's the same with 16550A LCR register layout.
>
> Signed-off-by: Ji-Ze Hong (Peter Hong) <hpeter+linux_kernel@...il.com>
> ---
> static void f81232_break_ctl(struct tty_struct *tty, int break_state)
> {
> - /* FIXME - Stubbed out for now */
> + struct usb_serial_port *port = tty->driver_data;
> + struct f81232_private *priv = usb_get_serial_port_data(port);
> + int status;
>
> - /*
> - * break_state = -1 to turn on break, and 0 to turn off break
> - * see drivers/char/tty_io.c to see it used.
> - * last_set_data_urb_value NEVER has the break bit set in it.
> - */
> + mutex_lock(&priv->lock);
> +
> + if (break_state)
> + priv->shadow_lcr |= UART_LCR_SBC;
> + else
> + priv->shadow_lcr &= ~UART_LCR_SBC;
> +
> + status = f81232_set_register(port, LINE_CONTROL_REGISTER,
> + priv->shadow_lcr);
> + if (status)
> + dev_err(&port->dev, "set break failed: %d\n", status);
> +
> + mutex_unlock(&priv->lock);
> }
> @@ -519,6 +530,7 @@ static int f81232_port_disable(struct usb_serial_port *port)
> static void f81232_set_termios(struct tty_struct *tty,
> struct usb_serial_port *port, struct ktermios *old_termios)
> {
> + struct f81232_private *priv = usb_get_serial_port_data(port);
> u8 new_lcr = 0;
> int status = 0;
> speed_t baudrate;
> @@ -572,11 +584,16 @@ static void f81232_set_termios(struct tty_struct *tty,
> break;
> }
>
> + mutex_lock(&priv->lock);
> +
> + new_lcr |= (priv->shadow_lcr & UART_LCR_SBC);
> status = f81232_set_register(port, LINE_CONTROL_REGISTER, new_lcr);
> if (status) {
> dev_err(&port->dev, "%s failed to set LCR: %d\n",
> __func__, status);
> }
> +
> + mutex_unlock(&priv->lock);
You forgot to update shadow_lcr here so the line settings would be
corrupted (e.g set to 5 bit words) whenever a break is signalled.
Did you not test this version of the patch?
I added the missing update, but please test the code that's in my
usb-next branch in a minute and confirm everything works as expected.
All four patches now applied.
Thanks,
Johan
Powered by blists - more mailing lists