static void leonuart_set_termios(struct uart_port *port, struct termios *termios, struct termios *old) { unsigned int cr; unsigned long flags; unsigned int baud, quot; /* * Ask the core to calculate the divisor for us. */ baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk / 16); if (baud == 0) { panic("invalid baudrate %i\n", port->uartclk / 16); } quot = (uart_get_divisor(port, baud)) * 2; //uart_get_divisor calc a *16 uart freq, leon is *8 cr = UART_GET_CTRL(port); cr &= ~(LEON_UCTRL_PE | LEON_UCTRL_PS); if (termios->c_cflag & PARENB) { cr |= LEON_UCTRL_PE; if ((termios->c_cflag & PARODD)) cr |= LEON_UCTRL_PS; } spin_lock_irqsave(&port->lock, flags); /* * Update the per-port timeout. */ uart_update_timeout(port, termios->c_cflag, baud); port->read_status_mask = LEON_USTAT_OV; if (termios->c_iflag & INPCK) port->read_status_mask |= LEON_USTAT_FE | LEON_USTAT_PE; /* * Characters to ignore */ port->ignore_status_mask = 0; if (termios->c_iflag & IGNPAR) port->ignore_status_mask |= LEON_USTAT_FE | LEON_USTAT_PE; /* * Ignore all characters if CREAD is not set. */ if ((termios->c_cflag & CREAD) == 0) port->ignore_status_mask |= LEON_USTAT_OV | LEON_USTAT_FE | LEON_USTAT_PE; /* Set baud rate */ quot -= 1; UART_PUT_SCAL(port, quot); UART_PUT_CTRL(port, cr); spin_unlock_irqrestore(&port->lock, flags); }
static void apbuart_set_termios(struct uart_port *port, struct ktermios *termios, struct ktermios *old) { unsigned int cr; unsigned long flags; unsigned int baud, quot; /* Ask the core to calculate the divisor for us. */ baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk / 16); if (baud == 0) panic("invalid baudrate %i\n", port->uartclk / 16); /* uart_get_divisor calc a *16 uart freq, apbuart is *8 */ quot = (uart_get_divisor(port, baud)) * 2; cr = UART_GET_CTRL(port); cr &= ~(UART_CTRL_PE | UART_CTRL_PS); if (termios->c_cflag & PARENB) { cr |= UART_CTRL_PE; if ((termios->c_cflag & PARODD)) cr |= UART_CTRL_PS; } /* Enable flow control. */ if (termios->c_cflag & CRTSCTS) cr |= UART_CTRL_FL; spin_lock_irqsave(&port->lock, flags); /* Update the per-port timeout. */ uart_update_timeout(port, termios->c_cflag, baud); port->read_status_mask = UART_STATUS_OE; if (termios->c_iflag & INPCK) port->read_status_mask |= UART_STATUS_FE | UART_STATUS_PE; /* Characters to ignore */ port->ignore_status_mask = 0; if (termios->c_iflag & IGNPAR) port->ignore_status_mask |= UART_STATUS_FE | UART_STATUS_PE; /* Ignore all characters if CREAD is not set. */ if ((termios->c_cflag & CREAD) == 0) port->ignore_status_mask |= UART_DUMMY_RSR_RX; /* Set baud rate */ quot -= 1; UART_PUT_SCAL(port, quot); UART_PUT_CTRL(port, cr); spin_unlock_irqrestore(&port->lock, flags); }
static void apbuart_set_termios(struct uart_port *port, struct ktermios *termios, struct ktermios *old) { unsigned int cr; unsigned long flags; unsigned int baud, quot; baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk / 16); if (baud == 0) panic("invalid baudrate %i\n", port->uartclk / 16); quot = (uart_get_divisor(port, baud)) * 2; cr = UART_GET_CTRL(port); cr &= ~(UART_CTRL_PE | UART_CTRL_PS); if (termios->c_cflag & PARENB) { cr |= UART_CTRL_PE; if ((termios->c_cflag & PARODD)) cr |= UART_CTRL_PS; } if (termios->c_cflag & CRTSCTS) cr |= UART_CTRL_FL; spin_lock_irqsave(&port->lock, flags); uart_update_timeout(port, termios->c_cflag, baud); port->read_status_mask = UART_STATUS_OE; if (termios->c_iflag & INPCK) port->read_status_mask |= UART_STATUS_FE | UART_STATUS_PE; port->ignore_status_mask = 0; if (termios->c_iflag & IGNPAR) port->ignore_status_mask |= UART_STATUS_FE | UART_STATUS_PE; if ((termios->c_cflag & CREAD) == 0) port->ignore_status_mask |= UART_DUMMY_RSR_RX; quot -= 1; UART_PUT_SCAL(port, quot); UART_PUT_CTRL(port, cr); spin_unlock_irqrestore(&port->lock, flags); }