mirror of https://gitee.com/openkylin/linux.git
serial: 8250: Add CAP_MINI, set for bcm2835aux
The AUX/mini-UART in the BCM2835 family of procesors is a cut-down 8250 clone. In particular it is lacking support for the following features: CSTOPB PARENB PARODD CMSPAR CS5 CS6 Add a new capability (UART_CAP_MINI) that exposes the restrictions to the user of the termios API by turning off the unsupported features in the request. N.B. It is almost possible to automatically discover the missing features by reading back the LCR register, but the CSIZE bits don't cooperate (contrary to the documentation, both bits are significant, but CS5 and CS6 are mapped to CS7) and the code is much longer. See: https://github.com/raspberrypi/linux/issues/1561 Signed-off-by: Phil Elwell <phil@raspberrypi.org> Acked-by: Eric Anholt <eric@anholt.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
9b7becf103
commit
d087e7a991
|
@ -81,6 +81,9 @@ struct serial8250_config {
|
||||||
#define UART_CAP_HFIFO (1 << 14) /* UART has a "hidden" FIFO */
|
#define UART_CAP_HFIFO (1 << 14) /* UART has a "hidden" FIFO */
|
||||||
#define UART_CAP_RPM (1 << 15) /* Runtime PM is active while idle */
|
#define UART_CAP_RPM (1 << 15) /* Runtime PM is active while idle */
|
||||||
#define UART_CAP_IRDA (1 << 16) /* UART supports IrDA line discipline */
|
#define UART_CAP_IRDA (1 << 16) /* UART supports IrDA line discipline */
|
||||||
|
#define UART_CAP_MINI (1 << 17) /* Mini UART on BCM283X family lacks:
|
||||||
|
* STOP PARITY EPAR SPAR WLEN5 WLEN6
|
||||||
|
*/
|
||||||
|
|
||||||
#define UART_BUG_QUOT (1 << 0) /* UART has buggy quot LSB */
|
#define UART_BUG_QUOT (1 << 0) /* UART has buggy quot LSB */
|
||||||
#define UART_BUG_TXEN (1 << 1) /* UART has buggy TX IIR status */
|
#define UART_BUG_TXEN (1 << 1) /* UART has buggy TX IIR status */
|
||||||
|
|
|
@ -39,7 +39,7 @@ static int bcm2835aux_serial_probe(struct platform_device *pdev)
|
||||||
|
|
||||||
/* initialize data */
|
/* initialize data */
|
||||||
spin_lock_init(&data->uart.port.lock);
|
spin_lock_init(&data->uart.port.lock);
|
||||||
data->uart.capabilities = UART_CAP_FIFO;
|
data->uart.capabilities = UART_CAP_FIFO | UART_CAP_MINI;
|
||||||
data->uart.port.dev = &pdev->dev;
|
data->uart.port.dev = &pdev->dev;
|
||||||
data->uart.port.regshift = 2;
|
data->uart.port.regshift = 2;
|
||||||
data->uart.port.type = PORT_16550;
|
data->uart.port.type = PORT_16550;
|
||||||
|
|
|
@ -2584,6 +2584,12 @@ serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
unsigned int baud, quot, frac = 0;
|
unsigned int baud, quot, frac = 0;
|
||||||
|
|
||||||
|
if (up->capabilities & UART_CAP_MINI) {
|
||||||
|
termios->c_cflag &= ~(CSTOPB | PARENB | PARODD | CMSPAR);
|
||||||
|
if ((termios->c_cflag & CSIZE) == CS5 ||
|
||||||
|
(termios->c_cflag & CSIZE) == CS6)
|
||||||
|
termios->c_cflag = (termios->c_cflag & ~CSIZE) | CS7;
|
||||||
|
}
|
||||||
cval = serial8250_compute_lcr(up, termios->c_cflag);
|
cval = serial8250_compute_lcr(up, termios->c_cflag);
|
||||||
|
|
||||||
baud = serial8250_get_baud_rate(port, termios, old);
|
baud = serial8250_get_baud_rate(port, termios, old);
|
||||||
|
|
Loading…
Reference in New Issue