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; }
static void stxh205_hom_early_console(void) { writel(0x1189 & ~0x80, early_console_base + 0x0c); /* ctrl */ writel(BAUDRATE_VAL_M1(115200), early_console_base); /* baud */ writel(20, early_console_base + 0x1c); /* timeout */ writel(1, early_console_base + 0x10); /* int */ writel(0x1189, early_console_base + 0x0c); /* ctrl */ mdelay(100); pr_info("Early console ready\n"); }
static void hom_init_early_console(void __iomem *asc_base, unsigned long asc_clk) { #define BAUDRATE_VAL_M1(bps, clk) \ ((((bps * (1 << 14)) + (1 << 13)) / (clk / (1 << 6)))) writel(0x1189 & ~0x80, asc_base + 0x0c);/* ctrl */ writel(BAUDRATE_VAL_M1(115200, asc_clk), asc_base); /* baud */ writel(20, asc_base + 0x1c); /* timeout */ writel(1, asc_base + 0x10); /* int */ writel(0x1189, asc_base + 0x0c); /* ctrl */ mdelay(100); pr_info("stm pm hom: Early console ready\n"); }
/* 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; }