[U-Boot] [PATCH 2/6] serial: add UniPhier serial driver
Marek Vasut
marex at denx.de
Fri Jul 4 16:40:29 CEST 2014
On Friday, July 04, 2014 at 12:19:14 PM, Masahiro Yamada wrote:
> The driver for on-chip UART used on Panasonic UniPhier platform.
>
> Signed-off-by: Masahiro Yamada <yamada.m at jp.panasonic.com>
[...]
> +static void uniphier_serial_init(struct uniphier_serial *port)
> +{
> + writeb(UART_LCR_WLS_8, &port->lcr);
> +
> +#define MODE_X_DIV 16
You can use just const unsigned here instead of #define.
> +
> + /* Compute divisor value. Normally, we should simply return:
> + * CONFIG_SYS_NS16550_CLK) / MODE_X_DIV / gd->baudrate
> + * but we need to round that value by adding 0.5.
> + * Rounding is especially important at high baud rates.
> + */
> + writew((CONFIG_SYS_UNIPHIER_UART_CLK + (gd->baudrate *
> + (MODE_X_DIV / 2))) / (MODE_X_DIV * gd->baudrate), &port->dlr);
> +}
> +
> +static void uniphier_serial_setbrg(struct uniphier_serial *port)
> +{
> + uniphier_serial_init(port);
> +}
> +
> +static int uniphier_serial_tstc(struct uniphier_serial *port)
> +{
> + return (readb(&port->lsr) & UART_LSR_DR) != 0;
> +}
> +
> +static int uniphier_serial_getc(struct uniphier_serial *port)
> +{
> + while (!uniphier_serial_tstc(port))
> + ;
> +
> + return readb(&port->rbr);
> +}
> +
> +static void uniphier_serial_putc(struct uniphier_serial *port, const char
> c) +{
> + if (c == '\n')
> + uniphier_serial_putc(port, '\r');
> +
> + while (!(readb(&port->lsr) & UART_LSR_THRE))
> + ;
I think in this function, you can avoid such completely unbounded loop.
[...]
Best regard,
Marek Vasut
More information about the U-Boot
mailing list