linux/drivers/tty/serial
Serge Semin 7b668c064e serial: 8250: Fix max baud limit in generic 8250 port
Standard 8250 UART ports are designed in a way so they can communicate
with baud rates up to 1/16 of a reference frequency. It's expected from
most of the currently supported UART controllers. That's why the former
version of serial8250_get_baud_rate() method called uart_get_baud_rate()
with min and max baud rates passed as (port->uartclk / 16 / UART_DIV_MAX)
and ((port->uartclk + tolerance) / 16) respectively. Doing otherwise, like
it was suggested in commit ("serial: 8250_mtk: support big baud rate."),
caused acceptance of bauds, which was higher than the normal UART
controllers actually supported. As a result if some user-space program
requested to set a baud greater than (uartclk / 16) it would have been
permitted without truncation, but then serial8250_get_divisor(baud)
(which calls uart_get_divisor() to get the reference clock divisor) would
have returned a zero divisor. Setting zero divisor will cause an
unpredictable effect varying from chip to chip. In case of DW APB UART the
communications just stop.

Lets fix this problem by getting back the limitation of (uartclk +
tolerance) / 16 maximum baud supported by the generic 8250 port. Mediatek
8250 UART ports driver developer shouldn't have touched it in the first
place  notably seeing he already provided a custom version of set_termios()
callback in that glue-driver which took into account the extended baud
rate values and accordingly updated the standard and vendor-specific
divisor latch registers anyway.

Fixes: 81bb549fdf ("serial: 8250_mtk: support big baud rate.")
Signed-off-by: Serge Semin <Sergey.Semin@baikalelectronics.ru>
Cc: Alexey Malahov <Alexey.Malahov@baikalelectronics.ru>
Cc: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
Cc: Paul Burton <paulburton@kernel.org>
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Long Cheng <long.cheng@mediatek.com>
Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Cc: Maxime Ripard <mripard@kernel.org>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Will Deacon <will@kernel.org>
Cc: Russell King <linux@armlinux.org.uk>
Cc: linux-mips@vger.kernel.org
Cc: linux-arm-kernel@lists.infradead.org
Cc: linux-mediatek@lists.infradead.org
Link: https://lore.kernel.org/r/20200506233136.11842-2-Sergey.Semin@baikalelectronics.ru
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2020-05-15 14:47:05 +02:00
..
8250 serial: 8250: Fix max baud limit in generic 8250 port 2020-05-15 14:47:05 +02:00
cpm_uart tty: serial: Use the correct style for SPDX License Identifier 2020-03-07 09:52:01 +01:00
jsm tty: serial: Use the correct style for SPDX License Identifier 2020-03-07 09:52:01 +01:00
21285.c tty: serial: 21285: stop using the unused[] variable from struct uart_port 2019-12-19 20:10:28 +01:00
altera_jtaguart.c
altera_uart.c
amba-pl010.c tty/serial: Migrate amba-pl01* to use has_sysrq 2019-12-18 15:04:44 +01:00
amba-pl011.c serial: amba-pl011: Make sure we initialize the port.lock spinlock 2020-05-05 16:24:22 +02:00
amba-pl011.h
apbuart.c tty/serial: Migrate apbuart to use has_sysrq 2019-12-18 15:04:44 +01:00
apbuart.h
ar933x_uart.c serial: Allow uart_get_rs485_mode() to return errno 2020-05-15 14:47:05 +02:00
arc_uart.c tty/serial: Migrate arc_uart to use has_sysrq 2019-12-18 15:04:45 +01:00
atmel_serial.c serial: Allow uart_get_rs485_mode() to return errno 2020-05-15 14:47:05 +02:00
atmel_serial.h tty: serial: Use the correct style for SPDX License Identifier 2020-03-07 09:52:01 +01:00
bcm63xx_uart.c Revert "tty: serial: bcm63xx: fix missing clk_put() in bcm63xx_uart" 2020-05-04 11:49:57 +02:00
clps711x.c tty/serial: Migrate clps711x to use has_sysrq 2019-12-18 15:04:46 +01:00
digicolor-usart.c
dz.c TTY/Serial driver updates for 5.6-rc1 2020-01-29 10:13:27 -08:00
dz.h
earlycon-arm-semihost.c
earlycon-riscv-sbi.c
earlycon.c serial: earlycon: prefer EARLYCON_DECLARE() variant 2020-03-07 09:52:01 +01:00
efm32-uart.c tty: serial: efm32: fix spelling mistake "reserverd" -> "reserved" 2020-02-19 11:38:58 +01:00
fsl_linflexuart.c tty/serial: Migrate fsl_linflexuart to use has_sysrq 2019-12-18 15:04:48 +01:00
fsl_lpuart.c serial: Allow uart_get_rs485_mode() to return errno 2020-05-15 14:47:05 +02:00
icom.c tty: serial: Remove call to memset after pci_alloc_consistent 2019-09-04 12:43:44 +02:00
icom.h tty: serial: Use the correct style for SPDX License Identifier 2020-03-07 09:52:01 +01:00
ifx6x60.c tty: serial: ifx6x60: Convert to GPIO descriptors 2020-03-12 10:03:54 +01:00
ifx6x60.h tty: serial: ifx6x60: Convert to GPIO descriptors 2020-03-12 10:03:54 +01:00
imx.c serial: Allow uart_get_rs485_mode() to return errno 2020-05-15 14:47:05 +02:00
ip22zilog.c tty/serial: Migrate ip22zilog to use has_sysrq 2019-12-18 15:04:50 +01:00
ip22zilog.h
Kconfig tty: serial: Add modem control gpio support for STM32 UART 2020-05-15 12:24:15 +02:00
kgdb_nmi.c tty/serial: kgdb_nmi: use true,false for bool variable 2020-01-14 14:34:04 +01:00
kgdboc.c kgdboc: Use for_each_console() helper 2020-02-10 12:34:43 -08:00
lantiq.c serial: lantiq: Make driver modular 2020-05-15 12:22:19 +02:00
lpc32xx_hs.c serial: lpc32xx_hs: Drop surplus include 2020-04-16 16:12:33 +02:00
Makefile {tty: serial, nand: onenand}: samsung: rename to fix build warning 2019-11-18 18:49:11 +01:00
max310x.c serial: max310x: turn off transmitter before activating AutoCTS or auto transmitter flow control 2019-09-05 09:57:44 +02:00
max3100.c
mcf.c
men_z135_uart.c drivers: mcb: use symbol namespaces 2019-11-03 19:54:53 +01:00
meson_uart.c TTY/Serial driver updates for 5.6-rc1 2020-01-29 10:13:27 -08:00
milbeaut_usio.c tty/serial: Migrate milbeaut_usio to use has_sysrq 2019-12-18 15:04:51 +01:00
mpc52xx_uart.c tty/serial: mpc52xx_uart: Don't zero port->sysrq 2019-12-18 15:04:52 +01:00
mps2-uart.c
msm_serial.c tty: serial: msm_serial: RX SW/FIFO mode fallback 2020-01-14 14:07:51 +01:00
mux.c TTY/Serial driver updates for 5.6-rc1 2020-01-29 10:13:27 -08:00
mvebu-uart.c tty:serial:mvebu-uart:fix a wrong return 2020-03-05 21:26:34 +01:00
mxs-auart.c tty/serial: Migrate mxs-auart to use has_sysrq 2019-12-18 15:04:53 +01:00
omap-serial.c serial: Allow uart_get_rs485_mode() to return errno 2020-05-15 14:47:05 +02:00
owl-uart.c tty: serial: owl: add "much needed" clk_prepare_enable() 2020-04-23 15:46:30 +02:00
pch_uart.c tty: serial: pch_uart: Use scnprintf() for avoiding potential buffer overflow 2020-03-18 12:59:29 +01:00
pic32_uart.c serial: pic32_uart: Use uart_console() helper 2020-03-12 10:00:22 +01:00
pic32_uart.h tty: serial: Use the correct style for SPDX License Identifier 2020-03-07 09:52:01 +01:00
pmac_zilog.c tty/serial: Migrate pmac_zilog to use has_sysrq 2019-12-18 15:04:56 +01:00
pmac_zilog.h
pnx8xxx_uart.c tty/serial: Migrate pnx8xxx_uart to use has_sysrq 2019-12-18 15:04:57 +01:00
pxa.c tty/serial: Migrate pxa to use has_sysrq 2019-12-18 15:04:57 +01:00
qcom_geni_serial.c Revert "tty: serial: qcom_geni_serial: Use OPP API to set clk/perf state" 2020-05-06 14:29:02 +02:00
rda-uart.c remove ioremap_nocache and devm_ioremap_nocache 2020-01-06 09:45:59 +01:00
rp2.c
sa1100.c tty/serial: Migrate sa1100 to use has_sysrq 2019-12-18 15:04:59 +01:00
samsung_tty.c tty: serial: samsung: Correct clock selection logic 2020-05-15 12:24:15 +02:00
sb1250-duart.c TTY/Serial driver updates for 5.6-rc1 2020-01-29 10:13:27 -08:00
sc16is7xx.c serial: sc16is7xx: Replace zero-length array with flexible-array member 2020-02-13 12:00:23 -08:00
sccnxp.c tty/serial: Migrate sccnxp to use has_sysrq 2019-12-18 15:05:00 +01:00
serial_core.c serial: Allow uart_get_rs485_mode() to return errno 2020-05-15 14:47:05 +02:00
serial_mctrl_gpio.c serial: mctrl_gpio: Check for NULL pointer 2019-10-07 13:21:54 +02:00
serial_mctrl_gpio.h tty: serial: Use the correct style for SPDX License Identifier 2020-03-07 09:52:01 +01:00
serial_txx9.c tty/serial: Migrate serial_txx9 to use has_sysrq 2019-12-18 15:05:01 +01:00
serial-tegra.c tty: serial: tegra: Handle RX transfer in PIO mode if DMA wasn't started 2020-02-10 12:32:13 -08:00
sh-sci.c serial: sh-sci: Make sure status register SCxSR is read in correct sequence 2020-04-16 16:16:52 +02:00
sh-sci.h serial: sh-sci: Drop unused include 2020-04-16 16:13:34 +02:00
sifive.c tty: serial: Add CONSOLE_POLL support to SiFive UART 2020-03-18 11:07:13 +01:00
sirfsoc_uart.c
sirfsoc_uart.h tty: serial: Use the correct style for SPDX License Identifier 2020-03-07 09:52:01 +01:00
sprd_serial.c serial: sprd: remove redundant sprd_port cleanup 2020-03-18 12:20:04 +01:00
st-asc.c tty: st-asc: switch to using devm_gpiod_get() 2020-01-10 14:01:33 +01:00
stm32-usart.c serial: Allow uart_get_rs485_mode() to return errno 2020-05-15 14:47:05 +02:00
stm32-usart.h tty: serial: Add modem control gpio support for STM32 UART 2020-05-15 12:24:15 +02:00
suncore.c
sunhv.c serial: sunhv: Initialize lock for non-registered console 2020-04-16 16:16:52 +02:00
sunsab.c tty/serial: Migrate sunsab to use has_sysrq 2019-12-18 15:05:05 +01:00
sunsab.h
sunsu.c tty/serial: Migrate sunsu to use has_sysrq 2019-12-18 15:05:06 +01:00
sunzilog.c tty/serial: Migrate sunzilog to use has_sysrq 2019-12-18 15:05:08 +01:00
sunzilog.h
tegra-tcu.c
timbuart.c
timbuart.h tty: serial: Use the correct style for SPDX License Identifier 2020-03-07 09:52:01 +01:00
uartlite.c Revert "serial-uartlite: Move the uart register" 2019-11-14 06:29:08 +08:00
ucc_uart.c ARM: SoC-related driver updates 2020-02-08 14:04:19 -08:00
vr41xx_siu.c tty/serial: Migrate vr41xx_siu to use has_sysrq 2019-12-18 15:05:09 +01:00
vt8500_serial.c tty/serial: Migrate vt8500_serial to use has_sysrq 2019-12-18 15:05:09 +01:00
xilinx_uartps.c Merge 5.7-rc5 into tty-next 2020-05-11 08:55:10 +02:00
zs.c TTY/Serial driver updates for 5.6-rc1 2020-01-29 10:13:27 -08:00
zs.h