static void meson_uart_set_termios(struct uart_port *port, struct ktermios *termios, struct ktermios *old) { unsigned int cflags, iflags, baud; unsigned long flags; u32 val; spin_lock_irqsave(&port->lock, flags); cflags = termios->c_cflag; iflags = termios->c_iflag; val = readl(port->membase + AML_UART_CONTROL); val &= ~AML_UART_DATA_LEN_MASK; switch (cflags & CSIZE) { case CS8: val |= AML_UART_DATA_LEN_8BIT; break; case CS7: val |= AML_UART_DATA_LEN_7BIT; break; case CS6: val |= AML_UART_DATA_LEN_6BIT; break; case CS5: val |= AML_UART_DATA_LEN_5BIT; break; } if (cflags & PARENB) val |= AML_UART_PARITY_EN; else val &= ~AML_UART_PARITY_EN; if (cflags & PARODD) val |= AML_UART_PARITY_TYPE; else val &= ~AML_UART_PARITY_TYPE; val &= ~AML_UART_STOP_BIN_LEN_MASK; if (cflags & CSTOPB) val |= AML_UART_STOP_BIN_2SB; else val &= ~AML_UART_STOP_BIN_1SB; if (cflags & CRTSCTS) val &= ~AML_UART_TWO_WIRE_EN; else val |= AML_UART_TWO_WIRE_EN; writel(val, port->membase + AML_UART_CONTROL); baud = uart_get_baud_rate(port, termios, old, 9600, 115200); meson_uart_change_speed(port, baud); port->read_status_mask = AML_UART_TX_FIFO_WERR; if (iflags & INPCK) port->read_status_mask |= AML_UART_PARITY_ERR | AML_UART_FRAME_ERR; port->ignore_status_mask = 0; if (iflags & IGNPAR) port->ignore_status_mask |= AML_UART_PARITY_ERR | AML_UART_FRAME_ERR; uart_update_timeout(port, termios->c_cflag, baud); spin_unlock_irqrestore(&port->lock, flags); }
static void am_uart_set_termios(struct uart_port *port, struct ktermios *termios, struct ktermios *old) { unsigned int baud; struct meson_uart_port * mup = &am_ports[port->line]; am_uart_t *uart = mup->uart; unsigned tmp; tmp = readl(&uart->mode); switch (termios->c_cflag & CSIZE) { case CS8: printk(KERN_DEBUG "config %s: Character length 8bits/char\n", mup->name); tmp &= ~(0x3 << 20); break; case CS7: printk(KERN_DEBUG "config %s: Character length 7bits/char\n", mup->name); tmp &= ~(0x1 << 21); tmp |= (0x1 << 20); break; case CS6: printk(KERN_DEBUG "config %s: Character length 6bits/char\n", mup->name); tmp |= 0x1 << 21; tmp &= ~(0x1 << 20); break; case CS5: printk(KERN_DEBUG "config %s: Character length 5bits/char\n", mup->name); tmp |= 0x3 << 20; break; default: printk(KERN_DEBUG "default config %s: Character length 8bits/char\n", mup->name); tmp &= ~(0x3 << 20); break; } if(PARENB & termios->c_cflag) { tmp |= 0x1 << 19; if(PARODD & termios->c_cflag) { tmp |= 0x1<<18; } else { tmp &=~(0x1 << 18); } } else { tmp &=~(0x1 << 19); } if(termios->c_cflag & CSTOPB) { tmp |= 0x1 << 16 ; tmp &=~(0x1 << 17); } else { tmp &=~(0x3 << 16); } if(termios->c_cflag & CRTSCTS) { tmp &= ~(0x1 << 15); } else { tmp |= (0x1 << 15); } writel(tmp, &uart->mode); baud = tty_termios_baud_rate(termios); if(baud){ meson_uart_change_speed(mup, baud); uart_update_timeout(port, termios->c_cflag, baud); } return; }