Skip to content

Commit

Permalink
serial: fsl_lpuart: Support common rs485 binding for RTS polarity
Browse files Browse the repository at this point in the history
Invoke the ->rs485_config callback on probe to set UARTMODEM_TXRTSPOL
appropriately based on the UART's device properties.

This implicitly sets UARTMODEM_TXRTSE if rs485 was enabled in the device
properties, so drop the identical code from lpuart_probe().

It also fixes a bug:  If an unsupported rs485 property was specified
(rs485-rx-during-tx or rs485-rts-delay), the driver returns -ENOSYS
without performing any cleanup, in particular without calling
uart_remove_one_port() or clk_disable_unprepare(), thus leaking the
uart_port. But with the invocation of ->rs485_config, the unsupported
properties are now cleared in struct serial_rs485 and thus ignored.
It therefore seems sufficient to just log an error instead of bailing
out.

Cc: Sascha Hauer <[email protected]>
Signed-off-by: Lukas Wunner <[email protected]>
Acked-by: Uwe Kleine-König <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>
  • Loading branch information
l1k authored and gregkh committed Nov 28, 2017
1 parent f1e5b61 commit 01d8453
Showing 1 changed file with 3 additions and 10 deletions.
13 changes: 3 additions & 10 deletions drivers/tty/serial/fsl_lpuart.c
Original file line number Diff line number Diff line change
Expand Up @@ -2208,21 +2208,14 @@ static int lpuart_probe(struct platform_device *pdev)

uart_get_rs485_mode(&pdev->dev, &sport->port.rs485);

if (sport->port.rs485.flags & SER_RS485_RX_DURING_TX) {
if (sport->port.rs485.flags & SER_RS485_RX_DURING_TX)
dev_err(&pdev->dev, "driver doesn't support RX during TX\n");
return -ENOSYS;
}

if (sport->port.rs485.delay_rts_before_send ||
sport->port.rs485.delay_rts_after_send) {
sport->port.rs485.delay_rts_after_send)
dev_err(&pdev->dev, "driver doesn't support RTS delays\n");
return -ENOSYS;
}

if (sport->port.rs485.flags & SER_RS485_ENABLED) {
sport->port.rs485.flags |= SER_RS485_RTS_ON_SEND;
writeb(UARTMODEM_TXRTSE, sport->port.membase + UARTMODEM);
}
lpuart_config_rs485(&sport->port, &sport->port.rs485);

sport->dma_tx_chan = dma_request_slave_channel(sport->port.dev, "tx");
if (!sport->dma_tx_chan)
Expand Down

0 comments on commit 01d8453

Please sign in to comment.