[PATCH] mpc5xxx_get_bus_frequency(): use common code on MPC512x and MPC52xx

Grant Likely grant.likely at secretlab.ca
Wed Jun 17 16:14:56 EST 2009


On Thu, Jun 11, 2009 at 2:19 PM, Wolfgang Denk<wd at denx.de> wrote:
> So far, MPC512x used mpc512x_find_ips_freq() to get the bus frequency,
> while MPC52xx used mpc52xx_find_ipb_freq().  Despite the different
> clock names (IPS vs. IPB) the code was identical.
>
> Use common code for both processor families.
>
> Signed-off-by: Wolfgang Denk <wd at denx.de>
> Cc: Grant Likely <grant.likely at secretlab.ca>
> Cc: Kumar Gala <galak at kernel.crashing.org>

You probably already know this, but this patch doesn't apply against
mainline, so I won't merge for 2.6.31.

g.

> ---
>
> This patch is not only intended to avoid code duplication, but it
> will be needed in a following patch that fixes a MII speed
> miscalculation in drivers/net/fs_enet/mii-fec.c - this patch allows
> for a clean solution that works both on MPC512x and MPC52x systems.
>
>  arch/powerpc/include/asm/mpc512x.h           |   22 -----------------
>  arch/powerpc/include/asm/mpc52xx.h           |    2 +-
>  arch/powerpc/include/asm/mpc5xxx.h           |   22 +++++++++++++++++
>  arch/powerpc/platforms/512x/clock.c          |    2 +-
>  arch/powerpc/platforms/512x/mpc512x.h        |    1 -
>  arch/powerpc/platforms/512x/mpc512x_shared.c |   23 ------------------
>  arch/powerpc/platforms/52xx/mpc52xx_common.c |   32 +------------------------
>  arch/powerpc/sysdev/Makefile                 |    3 ++
>  arch/powerpc/sysdev/mpc5xxx_clocks.c         |   33 ++++++++++++++++++++++++++
>  drivers/ata/pata_mpc52xx.c                   |    2 +-
>  drivers/i2c/busses/i2c-mpc.c                 |    2 +-
>  drivers/net/fec_mpc52xx.c                    |    2 +-
>  drivers/net/fec_mpc52xx_phy.c                |    2 +-
>  drivers/serial/mpc52xx_uart.c                |    5 +--
>  drivers/watchdog/mpc5200_wdt.c               |    2 +-
>  15 files changed, 68 insertions(+), 87 deletions(-)
>  delete mode 100644 arch/powerpc/include/asm/mpc512x.h
>  create mode 100644 arch/powerpc/include/asm/mpc5xxx.h
>  create mode 100644 arch/powerpc/sysdev/mpc5xxx_clocks.c
>
> diff --git a/arch/powerpc/include/asm/mpc512x.h b/arch/powerpc/include/asm/mpc512x.h
> deleted file mode 100644
> index c48a165..0000000
> --- a/arch/powerpc/include/asm/mpc512x.h
> +++ /dev/null
> @@ -1,22 +0,0 @@
> -/*
> - * Copyright (C) 2007 Freescale Semiconductor, Inc. All rights reserved.
> - *
> - * Author: John Rigby, <jrigby at freescale.com>, Friday Apr 13 2007
> - *
> - * Description:
> - * MPC5121 Prototypes and definitions
> - *
> - * This is free software; you can redistribute it and/or modify it
> - * under the terms of the GNU General Public License as published by
> - * the Free Software Foundation; either version 2 of the License, or
> - * (at your option) any later version.
> - *
> - */
> -
> -#ifndef __ASM_POWERPC_MPC512x_H__
> -#define __ASM_POWERPC_MPC512x_H__
> -
> -extern unsigned long mpc512x_find_ips_freq(struct device_node *node);
> -
> -#endif /* __ASM_POWERPC_MPC512x_H__ */
> -
> diff --git a/arch/powerpc/include/asm/mpc52xx.h b/arch/powerpc/include/asm/mpc52xx.h
> index 52e049c..1b4f697 100644
> --- a/arch/powerpc/include/asm/mpc52xx.h
> +++ b/arch/powerpc/include/asm/mpc52xx.h
> @@ -16,6 +16,7 @@
>  #ifndef __ASSEMBLY__
>  #include <asm/types.h>
>  #include <asm/prom.h>
> +#include <asm/mpc5xxx.h>
>  #endif /* __ASSEMBLY__ */
>
>  #include <linux/suspend.h>
> @@ -268,7 +269,6 @@ struct mpc52xx_intr {
>  #ifndef __ASSEMBLY__
>
>  /* mpc52xx_common.c */
> -extern unsigned int mpc52xx_find_ipb_freq(struct device_node *node);
>  extern void mpc5200_setup_xlb_arbiter(void);
>  extern void mpc52xx_declare_of_platform_devices(void);
>  extern void mpc52xx_map_common_devices(void);
> diff --git a/arch/powerpc/include/asm/mpc5xxx.h b/arch/powerpc/include/asm/mpc5xxx.h
> new file mode 100644
> index 0000000..5ce9c5f
> --- /dev/null
> +++ b/arch/powerpc/include/asm/mpc5xxx.h
> @@ -0,0 +1,22 @@
> +/*
> + * Copyright (C) 2007 Freescale Semiconductor, Inc. All rights reserved.
> + *
> + * Author: John Rigby, <jrigby at freescale.com>, Friday Apr 13 2007
> + *
> + * Description:
> + * MPC5xxx Prototypes and definitions
> + *
> + * This is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + *
> + */
> +
> +#ifndef __ASM_POWERPC_MPC5xxx_H__
> +#define __ASM_POWERPC_MPC5xxx_H__
> +
> +extern unsigned long mpc5xxx_get_bus_frequency(struct device_node *node);
> +
> +#endif /* __ASM_POWERPC_MPC5xxx_H__ */
> +
> diff --git a/arch/powerpc/platforms/512x/clock.c b/arch/powerpc/platforms/512x/clock.c
> index 1bcff94..f4c4c6f 100644
> --- a/arch/powerpc/platforms/512x/clock.c
> +++ b/arch/powerpc/platforms/512x/clock.c
> @@ -24,7 +24,7 @@
>  #include <linux/io.h>
>
>  #include <linux/of_platform.h>
> -#include <asm/mpc512x.h>
> +#include <asm/mpc5xxx.h>
>  #include <asm/clk_interface.h>
>
>  #undef CLK_DEBUG
> diff --git a/arch/powerpc/platforms/512x/mpc512x.h b/arch/powerpc/platforms/512x/mpc512x.h
> index 9c03693..22a5352 100644
> --- a/arch/powerpc/platforms/512x/mpc512x.h
> +++ b/arch/powerpc/platforms/512x/mpc512x.h
> @@ -11,7 +11,6 @@
>
>  #ifndef __MPC512X_H__
>  #define __MPC512X_H__
> -extern unsigned long mpc512x_find_ips_freq(struct device_node *node);
>  extern void __init mpc512x_init_IRQ(void);
>  void __init mpc512x_declare_of_platform_devices(void);
>  #endif                         /* __MPC512X_H__ */
> diff --git a/arch/powerpc/platforms/512x/mpc512x_shared.c b/arch/powerpc/platforms/512x/mpc512x_shared.c
> index d8cd579..434d683 100644
> --- a/arch/powerpc/platforms/512x/mpc512x_shared.c
> +++ b/arch/powerpc/platforms/512x/mpc512x_shared.c
> @@ -24,29 +24,6 @@
>
>  #include "mpc512x.h"
>
> -unsigned long
> -mpc512x_find_ips_freq(struct device_node *node)
> -{
> -       struct device_node *np;
> -       const unsigned int *p_ips_freq = NULL;
> -
> -       of_node_get(node);
> -       while (node) {
> -               p_ips_freq = of_get_property(node, "bus-frequency", NULL);
> -               if (p_ips_freq)
> -                       break;
> -
> -               np = of_get_parent(node);
> -               of_node_put(node);
> -               node = np;
> -       }
> -       if (node)
> -               of_node_put(node);
> -
> -       return p_ips_freq ? *p_ips_freq : 0;
> -}
> -EXPORT_SYMBOL(mpc512x_find_ips_freq);
> -
>  void __init mpc512x_init_IRQ(void)
>  {
>        struct device_node *np;
> diff --git a/arch/powerpc/platforms/52xx/mpc52xx_common.c b/arch/powerpc/platforms/52xx/mpc52xx_common.c
> index 8e3dd5a..a46bad0 100644
> --- a/arch/powerpc/platforms/52xx/mpc52xx_common.c
> +++ b/arch/powerpc/platforms/52xx/mpc52xx_common.c
> @@ -47,36 +47,6 @@ static DEFINE_SPINLOCK(mpc52xx_lock);
>  static struct mpc52xx_gpt __iomem *mpc52xx_wdt;
>  static struct mpc52xx_cdm __iomem *mpc52xx_cdm;
>
> -/**
> - *     mpc52xx_find_ipb_freq - Find the IPB bus frequency for a device
> - *     @node:  device node
> - *
> - *     Returns IPB bus frequency, or 0 if the bus frequency cannot be found.
> - */
> -unsigned int
> -mpc52xx_find_ipb_freq(struct device_node *node)
> -{
> -       struct device_node *np;
> -       const unsigned int *p_ipb_freq = NULL;
> -
> -       of_node_get(node);
> -       while (node) {
> -               p_ipb_freq = of_get_property(node, "bus-frequency", NULL);
> -               if (p_ipb_freq)
> -                       break;
> -
> -               np = of_get_parent(node);
> -               of_node_put(node);
> -               node = np;
> -       }
> -       if (node)
> -               of_node_put(node);
> -
> -       return p_ipb_freq ? *p_ipb_freq : 0;
> -}
> -EXPORT_SYMBOL(mpc52xx_find_ipb_freq);
> -
> -
>  /*
>  * Configure the XLB arbiter settings to match what Linux expects.
>  */
> @@ -221,7 +191,7 @@ unsigned int mpc52xx_get_xtal_freq(struct device_node *node)
>        if (!mpc52xx_cdm)
>                return 0;
>
> -       freq = mpc52xx_find_ipb_freq(node);
> +       freq = mpc5xxx_get_bus_frequency(node);
>        if (!freq)
>                return 0;
>
> diff --git a/arch/powerpc/sysdev/Makefile b/arch/powerpc/sysdev/Makefile
> index b33b28a..2a1df88 100644
> --- a/arch/powerpc/sysdev/Makefile
> +++ b/arch/powerpc/sysdev/Makefile
> @@ -47,6 +47,9 @@ obj-$(CONFIG_PPC_DCR)         += dcr.o
>  obj-$(CONFIG_8xx)              += mpc8xx_pic.o cpm1.o
>  obj-$(CONFIG_UCODE_PATCH)      += micropatch.o
>
> +obj-$(CONFIG_PPC_MPC512x)      += mpc5xxx_clocks.o
> +obj-$(CONFIG_PPC_MPC52xx)      += mpc5xxx_clocks.o
> +
>  ifeq ($(CONFIG_SUSPEND),y)
>  obj-$(CONFIG_6xx)              += 6xx-suspend.o
>  endif
> diff --git a/arch/powerpc/sysdev/mpc5xxx_clocks.c b/arch/powerpc/sysdev/mpc5xxx_clocks.c
> new file mode 100644
> index 0000000..34e12f9
> --- /dev/null
> +++ b/arch/powerpc/sysdev/mpc5xxx_clocks.c
> @@ -0,0 +1,33 @@
> +/**
> + *     mpc5xxx_get_bus_frequency - Find the bus frequency for a device
> + *     @node:  device node
> + *
> + *     Returns bus frequency (IPS on MPC512x, IPB on MPC52xx),
> + *     or 0 if the bus frequency cannot be found.
> + */
> +
> +#include <linux/kernel.h>
> +#include <linux/of_platform.h>
> +
> +unsigned int
> +mpc5xxx_get_bus_frequency(struct device_node *node)
> +{
> +       struct device_node *np;
> +       const unsigned int *p_bus_freq = NULL;
> +
> +       of_node_get(node);
> +       while (node) {
> +               p_bus_freq = of_get_property(node, "bus-frequency", NULL);
> +               if (p_bus_freq)
> +                       break;
> +
> +               np = of_get_parent(node);
> +               of_node_put(node);
> +               node = np;
> +       }
> +       if (node)
> +               of_node_put(node);
> +
> +       return p_bus_freq ? *p_bus_freq : 0;
> +}
> +EXPORT_SYMBOL(mpc5xxx_get_bus_frequency);
> diff --git a/drivers/ata/pata_mpc52xx.c b/drivers/ata/pata_mpc52xx.c
> index 68d27bc..2bc2dbe 100644
> --- a/drivers/ata/pata_mpc52xx.c
> +++ b/drivers/ata/pata_mpc52xx.c
> @@ -694,7 +694,7 @@ mpc52xx_ata_probe(struct of_device *op, const struct of_device_id *match)
>        struct bcom_task *dmatsk = NULL;
>
>        /* Get ipb frequency */
> -       ipb_freq = mpc52xx_find_ipb_freq(op->node);
> +       ipb_freq = mpc5xxx_get_bus_frequency(op->node);
>        if (!ipb_freq) {
>                dev_err(&op->dev, "could not determine IPB bus frequency\n");
>                return -ENODEV;
> diff --git a/drivers/i2c/busses/i2c-mpc.c b/drivers/i2c/busses/i2c-mpc.c
> index dd778d7..d325e86 100644
> --- a/drivers/i2c/busses/i2c-mpc.c
> +++ b/drivers/i2c/busses/i2c-mpc.c
> @@ -197,7 +197,7 @@ int mpc_i2c_get_fdr_52xx(struct device_node *node, u32 clock, int prescaler)
>                return -EINVAL;
>
>        /* Determine divider value */
> -       divider = mpc52xx_find_ipb_freq(node) / clock;
> +       divider = mpc5xxx_get_bus_frequency(node) / clock;
>
>        /*
>         * We want to choose an FDR/DFSR that generates an I2C bus speed that
> diff --git a/drivers/net/fec_mpc52xx.c b/drivers/net/fec_mpc52xx.c
> index 8bbe7f6..5ddf033 100644
> --- a/drivers/net/fec_mpc52xx.c
> +++ b/drivers/net/fec_mpc52xx.c
> @@ -1006,7 +1006,7 @@ mpc52xx_fec_probe(struct of_device *op, const struct of_device_id *match)
>        priv->phy_addr = FEC5200_PHYADDR_NONE;
>        priv->speed = 100;
>        priv->duplex = DUPLEX_HALF;
> -       priv->phy_speed = ((mpc52xx_find_ipb_freq(op->node) >> 20) / 5) << 1;
> +       priv->phy_speed = ((mpc5xxx_get_bus_frequency(op->node) >> 20) / 5) << 1;
>
>        /* the 7-wire property means don't use MII mode */
>        if (of_find_property(op->node, "fsl,7-wire-mode", NULL))
> diff --git a/drivers/net/fec_mpc52xx_phy.c b/drivers/net/fec_mpc52xx_phy.c
> index dd9bfa4..176e9b8 100644
> --- a/drivers/net/fec_mpc52xx_phy.c
> +++ b/drivers/net/fec_mpc52xx_phy.c
> @@ -120,7 +120,7 @@ static int mpc52xx_fec_mdio_probe(struct of_device *of,
>
>        /* set MII speed */
>        out_be32(&priv->regs->mii_speed,
> -               ((mpc52xx_find_ipb_freq(of->node) >> 20) / 5) << 1);
> +               ((mpc5xxx_get_bus_frequency(of->node) >> 20) / 5) << 1);
>
>        err = mdiobus_register(bus);
>        if (err)
> diff --git a/drivers/serial/mpc52xx_uart.c b/drivers/serial/mpc52xx_uart.c
> index b3feb61..abbd146 100644
> --- a/drivers/serial/mpc52xx_uart.c
> +++ b/drivers/serial/mpc52xx_uart.c
> @@ -76,7 +76,6 @@
>  #include <linux/of_platform.h>
>
>  #include <asm/mpc52xx.h>
> -#include <asm/mpc512x.h>
>  #include <asm/mpc52xx_psc.h>
>
>  #if defined(CONFIG_SERIAL_MPC52xx_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
> @@ -254,7 +253,7 @@ static unsigned long mpc52xx_getuartclk(void *p)
>         * but the generic serial code assumes 16
>         * so return ipb freq / 2
>         */
> -       return mpc52xx_find_ipb_freq(p) / 2;
> +       return mpc5xxx_get_bus_frequency(p) / 2;
>  }
>
>  static struct psc_ops mpc52xx_psc_ops = {
> @@ -391,7 +390,7 @@ static void mpc512x_psc_cw_restore_ints(struct uart_port *port)
>
>  static unsigned long mpc512x_getuartclk(void *p)
>  {
> -       return mpc512x_find_ips_freq(p);
> +       return mpc5xxx_get_bus_frequency(p);
>  }
>
>  static struct psc_ops mpc512x_psc_ops = {
> diff --git a/drivers/watchdog/mpc5200_wdt.c b/drivers/watchdog/mpc5200_wdt.c
> index 465fe36..fa9c47c 100644
> --- a/drivers/watchdog/mpc5200_wdt.c
> +++ b/drivers/watchdog/mpc5200_wdt.c
> @@ -188,7 +188,7 @@ static int mpc5200_wdt_probe(struct of_device *op,
>        if (!wdt)
>                return -ENOMEM;
>
> -       wdt->ipb_freq = mpc52xx_find_ipb_freq(op->node);
> +       wdt->ipb_freq = mpc5xxx_get_bus_frequency(op->node);
>
>        err = of_address_to_resource(op->node, 0, &wdt->mem);
>        if (err)
> --
> 1.6.0.6
>
>



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


More information about the Linuxppc-dev mailing list