Exemplo n.º 1
0
static int _sti_asc_serial_setbrg(struct sti_asc_uart *uart, int baudrate)
{
	unsigned long val;
	int t, mode = 1;

	switch (baudrate) {
	case 9600:
		t = BAUDRATE_VAL_M0(9600);
		mode = 0;
		break;
	case 19200:
		t = BAUDRATE_VAL_M1(19200);
		break;
	case 38400:
		t = BAUDRATE_VAL_M1(38400);
		break;
	case 57600:
		t = BAUDRATE_VAL_M1(57600);
		break;
	default:
		debug("ASC: unsupported baud rate: %d, using 115200 instead.\n",
		      baudrate);
	case 115200:
		t = BAUDRATE_VAL_M1(115200);
		break;
	}

	/* disable the baudrate generator */
	val = readl(&uart->control);
	writel(val & ~RUN, &uart->control);

	/* set baud generator reload value */
	writel(t, &uart->baudrate);
	/* reset the RX & TX buffers */
	writel(1, &uart->txreset);
	writel(1, &uart->rxreset);

	/* set baud generator mode */
	if (mode)
		val |= BAUDMODE;

	/* finally, write value and enable ASC */
	writel(val, &uart->control);

	return 0;
}
Exemplo n.º 2
0
/* initialize the ASC */
extern int serial_init (void)
{
	const int cflag = CREAD | HUPCL | CLOCAL | CSTOPB | CS8 | PARODD;
	unsigned long val;
	int baud = gd->baudrate;
	int t, mode=1;

	switch (baud) {
#if 0
	case 0:
		t = -1;
		break;
	case 2400:
		t = BAUDRATE_VAL_M0(2400);
		mode = 0;
		break;
	case 4800:
		t = BAUDRATE_VAL_M0(4800);
		mode = 0;
		break;
#endif
	case 9600:
		t = BAUDRATE_VAL_M0(9600);
		mode = 0;
		break;
	case 19200:
		t = BAUDRATE_VAL_M1(19200);
		break;
	case 38400:
		t = BAUDRATE_VAL_M1(38400);
		break;
	case 57600:
		t = BAUDRATE_VAL_M1(57600);
		break;
	default:
		printf ("ASC: unsupported baud rate: %d, using 115200 instead.\n", baud);
	case 115200:
		t = BAUDRATE_VAL_M1(115200);
		break;
	}

	/* wait for end of current transmission */
	TxCharReady ();

	/* disable the baudrate generator */
	val = p2_inl (UART_CONTROL_REG);
	p2_outl (UART_CONTROL_REG, (val & ~RUN));

	/* set baud generator reload value */
	p2_outl (UART_BAUDRATE_REG, t);

	/* reset the RX & TX buffers */
	p2_outl (UART_TXRESET_REG, 1);
	p2_outl (UART_RXRESET_REG, 1);

	/* build up the value to be written to CONTROL */
	val = RXENABLE | RUN;

	/* set character length */
	if ((cflag & CSIZE) == CS7)
		val |= MODE_7BIT_PAR;
	else {
		if (cflag & PARENB)
			val |= MODE_8BIT_PAR;
		else
			val |= MODE_8BIT;
	}

	/* set stop bit */
	/* it seems no '0 stop bits' option is available: by default
	 * we get 0.5 stop bits */
	if (cflag & CSTOPB)
		val |= STOP_1BIT;

	/* odd parity */
	if (cflag & PARODD)
		val |= PARITYODD;

#ifdef CONFIG_HWFLOW
	/*  set flow control */
	if (hwflow)
		val |= CTSENABLE;
#endif	/* CONFIG_HWFLOW */

	/* set baud generator mode */
	if (mode)
		val |= BAUDMODE;

	/* finally, write value and enable ASC */
	p2_outl (UART_CONTROL_REG, val);
	return 0;
}