/* * Set baud rate. The settings are always 8n1: * 8 data bits, no parity, 1 stop bit */ void mxs_serial_setbrg(void) { u32 div; u32 linectrl = 0; /* Calculate and set baudrate */ div = (CONFIG_UARTAPP_CLK * 32) / gd->baudrate; linectrl |= BF_UARTAPP_LINECTRL_BAUD_DIVFRAC(div & 0x3F); linectrl |= BF_UARTAPP_LINECTRL_BAUD_DIVINT(div >> 6); linectrl |= BF_UARTAPP_LINECTRL_WLEN(3); /* 8 bit */ linectrl |= BM_UARTAPP_LINECTRL_FEN; /* enable fifo */ REG_WR(MXS_UARTAPP_BASE, HW_UARTAPP_LINECTRL, linectrl); }
static void stmp_appuart_settermios(struct uart_port *u, struct ktermios *nw, struct ktermios *old) { static struct ktermios saved; struct stmp_appuart_port *s = to_appuart(u); unsigned int cflag; u32 bm, ctrl, ctrl2, div; int err = 0; unsigned baud; dev_dbg(s->dev, "%s\n", __func__); if (nw) memcpy(&saved, nw, sizeof *nw); else nw = old = &saved; cflag = nw->c_cflag; ctrl = BM_UARTAPP_LINECTRL_FEN; ctrl2 = HW_UARTAPP_CTRL2_RD_NB(s->mem); /* byte size */ switch (cflag & CSIZE) { case CS5: bm = 0; break; case CS6: bm = 1; break; case CS7: bm = 2; break; case CS8: bm = 3; break; default: err = -EINVAL; break; } if (err) goto out; dev_dbg(s->dev, "Byte size %d bytes, mask %x\n", bm + 5, BF_UARTAPP_LINECTRL_WLEN(bm)); ctrl |= BF_UARTAPP_LINECTRL_WLEN(bm); /* parity */ if (cflag & PARENB) { dev_dbg(s->dev, "Parity check enabled\n"); ctrl |= BM_UARTAPP_LINECTRL_PEN | BM_UARTAPP_LINECTRL_SPS; if ((cflag & PARODD) == 0) { dev_dbg(s->dev, "(Even) mask = %x\n", BM_UARTAPP_LINECTRL_PEN | BM_UARTAPP_LINECTRL_SPS | BM_UARTAPP_LINECTRL_EPS); ctrl |= BM_UARTAPP_LINECTRL_EPS; } else dev_dbg(s->dev, "(Odd) mask = %x\n", BM_UARTAPP_LINECTRL_PEN | BM_UARTAPP_LINECTRL_SPS); } else dev_dbg(s->dev, "Parity check disabled.\n"); /* figure out the stop bits requested */ if (cflag & CSTOPB) { dev_dbg(s->dev, "Stop bits, mask = %x\n", BM_UARTAPP_LINECTRL_STP2); ctrl |= BM_UARTAPP_LINECTRL_STP2; } else dev_dbg(s->dev, "No stop bits\n"); /* figure out the hardware flow control settings */ if (cflag & CRTSCTS) { dev_dbg(s->dev, "RTS/CTS flow control\n"); ctrl2 |= BM_UARTAPP_CTRL2_CTSEN /* | BM_UARTAPP_CTRL2_RTSEN */; } else { dev_dbg(s->dev, "RTS/CTS disabled\n"); ctrl2 &= ~BM_UARTAPP_CTRL2_CTSEN; } /* set baud rate */ baud = uart_get_baud_rate(u, nw, old, 0, u->uartclk); dev_dbg(s->dev, "Baud rate requested: %d (clk = %d)\n", baud, u->uartclk); div = u->uartclk * 32 / baud; ctrl |= BF_UARTAPP_LINECTRL_BAUD_DIVFRAC(div & 0x3F); ctrl |= BF_UARTAPP_LINECTRL_BAUD_DIVINT(div >> 6); if ((cflag & CREAD) != 0) { dev_dbg(s->dev, "RX started\n"); ctrl2 |= BM_UARTAPP_CTRL2_RXE | BM_UARTAPP_CTRL2_RXDMAE; } if (!err) { dev_dbg(s->dev, "CTRLS = %x + %x\n", ctrl, ctrl2); HW_UARTAPP_LINECTRL_WR_NB(s->mem, ctrl); HW_UARTAPP_CTRL2_WR_NB(s->mem, ctrl2); } out: return /* err */; }