Exemplo n.º 1
0
/*
 * 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 */;
}