serial: samsung: add support for manual RTS setting
The Samsung serial driver currently does not support setting the RTS pin with an ioctl(TIOCMSET) call. This patch adds this support. Changes in v2: - Preserve the RTS pin's manual setting in set_termios() also when enabling CRTSCTS. Signed-off-by: José Miguel Gonçalves <jose.goncalves@inov.pt> Reviewed-by: Tomasz Figa <t.figa@samsung.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
4190390ad2
commit
2d1e5a4896
|
@ -407,7 +407,14 @@ static unsigned int s3c24xx_serial_get_mctrl(struct uart_port *port)
|
||||||
|
|
||||||
static void s3c24xx_serial_set_mctrl(struct uart_port *port, unsigned int mctrl)
|
static void s3c24xx_serial_set_mctrl(struct uart_port *port, unsigned int mctrl)
|
||||||
{
|
{
|
||||||
/* todo - possibly remove AFC and do manual CTS */
|
unsigned int umcon = rd_regl(port, S3C2410_UMCON);
|
||||||
|
|
||||||
|
if (mctrl & TIOCM_RTS)
|
||||||
|
umcon |= S3C2410_UMCOM_RTS_LOW;
|
||||||
|
else
|
||||||
|
umcon &= ~S3C2410_UMCOM_RTS_LOW;
|
||||||
|
|
||||||
|
wr_regl(port, S3C2410_UMCON, umcon);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void s3c24xx_serial_break_ctl(struct uart_port *port, int break_state)
|
static void s3c24xx_serial_break_ctl(struct uart_port *port, int break_state)
|
||||||
|
@ -774,8 +781,6 @@ static void s3c24xx_serial_set_termios(struct uart_port *port,
|
||||||
if (termios->c_cflag & CSTOPB)
|
if (termios->c_cflag & CSTOPB)
|
||||||
ulcon |= S3C2410_LCON_STOPB;
|
ulcon |= S3C2410_LCON_STOPB;
|
||||||
|
|
||||||
umcon = (termios->c_cflag & CRTSCTS) ? S3C2410_UMCOM_AFC : 0;
|
|
||||||
|
|
||||||
if (termios->c_cflag & PARENB) {
|
if (termios->c_cflag & PARENB) {
|
||||||
if (termios->c_cflag & PARODD)
|
if (termios->c_cflag & PARODD)
|
||||||
ulcon |= S3C2410_LCON_PODD;
|
ulcon |= S3C2410_LCON_PODD;
|
||||||
|
@ -792,6 +797,15 @@ static void s3c24xx_serial_set_termios(struct uart_port *port,
|
||||||
|
|
||||||
wr_regl(port, S3C2410_ULCON, ulcon);
|
wr_regl(port, S3C2410_ULCON, ulcon);
|
||||||
wr_regl(port, S3C2410_UBRDIV, quot);
|
wr_regl(port, S3C2410_UBRDIV, quot);
|
||||||
|
|
||||||
|
umcon = rd_regl(port, S3C2410_UMCON);
|
||||||
|
if (termios->c_cflag & CRTSCTS) {
|
||||||
|
umcon |= S3C2410_UMCOM_AFC;
|
||||||
|
/* Disable RTS when RX FIFO contains 63 bytes */
|
||||||
|
umcon &= ~S3C2412_UMCON_AFC_8;
|
||||||
|
} else {
|
||||||
|
umcon &= ~S3C2410_UMCOM_AFC;
|
||||||
|
}
|
||||||
wr_regl(port, S3C2410_UMCON, umcon);
|
wr_regl(port, S3C2410_UMCON, umcon);
|
||||||
|
|
||||||
if (ourport->info->has_divslot)
|
if (ourport->info->has_divslot)
|
||||||
|
|
Loading…
Reference in New Issue