[PATCH] [ARM] serial/pxa: work around Errata #75

Haojian Zhuang haojian.zhuang at gmail.com
Sat Nov 7 04:45:13 EST 2009


2009/11/7 Uwe Kleine-König <u.kleine-koenig at pengutronix.de>:
> Hello,
>
> [Added Greg to Cc:]
>
> On Tue, Nov 03, 2009 at 11:47:15AM +0100, Uwe Kleine-König wrote:
>> Intel(R) PXA27x Processor Family Specification Update (Nov 2005)
>> says:
>>
>>   E75. UART: Baud rate may not be programmed correctly on
>>        back-to-back writes.
>>
>>   Problem:
>>   When programming the Divisor Latch registers, Low and High (DLL and
>>   DLH), with back-to-back writes, the second register write may not
>>   take effect. The result is an incorrect baud rate.
>>
>>   Workaround:
>>   After programming the first Divisor Latch register, read and verify
>>   it before programming the second Divisor Latch register.
>>
>> This was hit when changing the baud rate from 115200 to 9600 while
>> receiving characters at 9600 Bd.
>>
>> And fixed indention of some comments nearby.
> I havn't received any feed-back for this up to now.
>
> Did I address the right people?  Are you just burried in work?
> Assuming the patch is OK, which is the right path into mainline?
> Some patches touching drivers/serial/pxa.c went in via Russell's tree,
> bdc04e3 (serial: move delta_msr_wait into the tty_port) went in via
> gregkh/tty-2.6.
>
> Greg: as you didn't get the original patch you can find it below.
>
> Best regards
> Uwe
>
> From d49d3dd085215de67e1cc3d7129abaa8c70b3646 Mon Sep 17 00:00:00 2001
> From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= <u.kleine-koenig at pengutronix.de>
> Date: Tue, 3 Nov 2009 11:02:37 +0100
> Subject: [PATCH 1/3] [ARM] serial/pxa: work around Errata #75
> MIME-Version: 1.0
> Content-Type: text/plain; charset=UTF-8
> Content-Transfer-Encoding: 8bit
>
> Intel(R) PXA27x Processor Family Specification Update (Nov 2005)
> says:
>
>  E75. UART: Baud rate may not be programmed correctly on
>       back-to-back writes.
>
>  Problem:
>  When programming the Divisor Latch registers, Low and High (DLL and
>  DLH), with back-to-back writes, the second register write may not
>  take effect. The result is an incorrect baud rate.
>
>  Workaround:
>  After programming the first Divisor Latch register, read and verify
>  it before programming the second Divisor Latch register.
>
> This was hit when changing the baud rate from 115200 to 9600 while
> receiving characters at 9600 Bd.
>
> And fixed indention of some comments nearby.
>
> Signed-off-by: Uwe Kleine-König <u.kleine-koenig at pengutronix.de>
> Acked-by: Wolfram Sang <w.sang at pengutronix.de>
> Acked-by: Marc Kleine-Budde <mkl at pengutronix.de>
> Cc: Eric Miao <eric.y.miao at gmail.com>
> Cc: Alan Cox <alan at linux.intel.com>
> Cc: Mike Rapoport <mike at compulab.co.il>
> ---
>  drivers/serial/pxa.c |   13 +++++++++++--
>  1 files changed, 11 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/serial/pxa.c b/drivers/serial/pxa.c
> index b8629d7..4a82104 100644
> --- a/drivers/serial/pxa.c
> +++ b/drivers/serial/pxa.c
> @@ -438,6 +438,7 @@ serial_pxa_set_termios(struct uart_port *port, struct ktermios *termios,
>        unsigned char cval, fcr = 0;
>        unsigned long flags;
>        unsigned int baud, quot;
> +       unsigned int dll;
>
>        switch (termios->c_cflag & CSIZE) {
>        case CS5:
> @@ -534,10 +535,18 @@ serial_pxa_set_termios(struct uart_port *port, struct ktermios *termios,
>        else
>                up->mcr &= ~UART_MCR_AFE;
>
> -       serial_out(up, UART_LCR, cval | UART_LCR_DLAB);/* set DLAB */
> +       serial_out(up, UART_LCR, cval | UART_LCR_DLAB); /* set DLAB */
>        serial_out(up, UART_DLL, quot & 0xff);          /* LS of divisor */
> +
> +       /*
> +        * work around Errata #75 according to Intel(R) PXA27x Processor Family
> +        * Specification Update (Nov 2005)
> +        */
> +       dll = serial_in(up, UART_DLL);
> +       WARN_ON(dll != (quot & 0xff));
> +
Would you mind to use a loop at here? In order to make sure register
is updated as expected.
>        serial_out(up, UART_DLM, quot >> 8);            /* MS of divisor */
> -       serial_out(up, UART_LCR, cval);         /* reset DLAB */
> +       serial_out(up, UART_LCR, cval);                 /* reset DLAB */
>        up->lcr = cval;                                 /* Save LCR */
>        serial_pxa_set_mctrl(&up->port, up->port.mctrl);
>        serial_out(up, UART_FCR, fcr);
> --
> 1.6.5.2
>
>
> --
> Pengutronix e.K.                              | Uwe Kleine-König            |
> Industrial Linux Solutions                    | http://www.pengutronix.de/  |
>
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
>



More information about the linux-arm-kernel mailing list