[Patch] mpc5200b: improve baud rate calculation (reach high baud rates, better accuracy)

Grant Likely grant.likely at secretlab.ca
Wed Mar 3 07:22:08 EST 2010


Hi Albrecht,

Thanks for this work, comment below...

On Mon, Mar 1, 2010 at 11:11 AM, Albrecht Dreß <albrecht.dress at arcor.de> wrote:
> On the MPC5200B, select the baud rate prescaler as /4 by default to make very
> high baud rates (e.g. 3 MBaud) accessible and to achieve a higher precision
> for high baud rates in general. For baud rates below ~500 Baud, the code will
> automatically fall back to the /32 prescaler.  The original MPC5200 does only
> have a /32 prescaler which is detected only once and stored in a global.  A
> new chip-dependent method is used to set the divisor.
>
> Tested on a custom 5200B based board, with up to 3 MBaud.
>
> Signed-off-by: Albrecht Dreß <albrecht.dress at arcor.de>
>
> ---
>
> --- linux-2.6.33/drivers/serial/mpc52xx_uart.c.orig     2010-02-24 19:52:17.000000000 +0100
> +++ linux-2.6.33/drivers/serial/mpc52xx_uart.c  2010-02-26 21:12:51.000000000 +0100
>  /* Search for bus-frequency property in this node or a parent */
>  static unsigned long mpc52xx_getuartclk(void *p)
>  {
>        /*
> -        * 5200 UARTs have a / 32 prescaler
> -        * but the generic serial code assumes 16
> -        * so return ipb freq / 2
> +        * The 5200 has only /32 prescalers.
> +        * 5200B UARTs have a /4 or a /32 prescaler.  For higher accuracy, we
> +        * do all calculations using the /4 prescaler for this chip.
> +        * The generic serial code assumes /16 so return ipb freq / 2 (5200)
> +        * or ipb freq * 4 (5200B).
>         */
> -       return mpc5xxx_get_bus_frequency(p) / 2;
> +       if (is_mpc5200b == 1)
> +               return mpc5xxx_get_bus_frequency(p) * 4;
> +       else
> +               return mpc5xxx_get_bus_frequency(p) / 2;
>  }

Remove this function entirely and the associated .getuartclk() hook
from the psc_ops structure.  Callers can just call
mpc5xxx_get_bus_frequency() directly.  mpc5121 already just passes
back the return value unmodified, and current mpc52xx code uses a /2,
but that would be eliminated if the new set_divisor hook took that
into account.  That way all the chip-specific clock setup calculation
is consolidated into a single function.  I like patches that make
things simpler.

-- 
Grant Likely, B.Sc., P.Eng.
Secret Lab Technologies Ltd.


More information about the Linuxppc-dev mailing list