powerpc/5xxx: Add common mpc5xxx_get_bus_frequency() function

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@denx.de>
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
This commit is contained in:
Wolfgang Denk 2009-06-17 00:30:22 -06:00 committed by Grant Likely
parent c155ee10c2
commit 87c441e54d
14 changed files with 51 additions and 70 deletions

View file

@ -16,6 +16,7 @@
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
#include <asm/types.h> #include <asm/types.h>
#include <asm/prom.h> #include <asm/prom.h>
#include <asm/mpc5xxx.h>
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */
#include <linux/suspend.h> #include <linux/suspend.h>
@ -268,7 +269,6 @@ struct mpc52xx_intr {
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
/* mpc52xx_common.c */ /* mpc52xx_common.c */
extern unsigned int mpc52xx_find_ipb_freq(struct device_node *node);
extern void mpc5200_setup_xlb_arbiter(void); extern void mpc5200_setup_xlb_arbiter(void);
extern void mpc52xx_declare_of_platform_devices(void); extern void mpc52xx_declare_of_platform_devices(void);
extern void mpc52xx_map_common_devices(void); extern void mpc52xx_map_common_devices(void);

View file

@ -4,7 +4,7 @@
* Author: John Rigby, <jrigby@freescale.com>, Friday Apr 13 2007 * Author: John Rigby, <jrigby@freescale.com>, Friday Apr 13 2007
* *
* Description: * Description:
* MPC5121 Prototypes and definitions * MPC5xxx Prototypes and definitions
* *
* This is free software; you can redistribute it and/or modify it * This is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by * under the terms of the GNU General Public License as published by
@ -13,10 +13,10 @@
* *
*/ */
#ifndef __ASM_POWERPC_MPC512x_H__ #ifndef __ASM_POWERPC_MPC5xxx_H__
#define __ASM_POWERPC_MPC512x_H__ #define __ASM_POWERPC_MPC5xxx_H__
extern unsigned long mpc512x_find_ips_freq(struct device_node *node); extern unsigned long mpc5xxx_get_bus_frequency(struct device_node *node);
#endif /* __ASM_POWERPC_MPC512x_H__ */ #endif /* __ASM_POWERPC_MPC5xxx_H__ */

View file

@ -24,7 +24,7 @@
#include <linux/io.h> #include <linux/io.h>
#include <linux/of_platform.h> #include <linux/of_platform.h>
#include <asm/mpc512x.h> #include <asm/mpc5xxx.h>
#include <asm/clk_interface.h> #include <asm/clk_interface.h>
#undef CLK_DEBUG #undef CLK_DEBUG

View file

@ -11,7 +11,6 @@
#ifndef __MPC512X_H__ #ifndef __MPC512X_H__
#define __MPC512X_H__ #define __MPC512X_H__
extern unsigned long mpc512x_find_ips_freq(struct device_node *node);
extern void __init mpc512x_init_IRQ(void); extern void __init mpc512x_init_IRQ(void);
void __init mpc512x_declare_of_platform_devices(void); void __init mpc512x_declare_of_platform_devices(void);
#endif /* __MPC512X_H__ */ #endif /* __MPC512X_H__ */

View file

@ -24,29 +24,6 @@
#include "mpc512x.h" #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) void __init mpc512x_init_IRQ(void)
{ {
struct device_node *np; struct device_node *np;

View file

@ -47,36 +47,6 @@ static DEFINE_SPINLOCK(mpc52xx_lock);
static struct mpc52xx_gpt __iomem *mpc52xx_wdt; static struct mpc52xx_gpt __iomem *mpc52xx_wdt;
static struct mpc52xx_cdm __iomem *mpc52xx_cdm; 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. * 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) if (!mpc52xx_cdm)
return 0; return 0;
freq = mpc52xx_find_ipb_freq(node); freq = mpc5xxx_get_bus_frequency(node);
if (!freq) if (!freq)
return 0; return 0;

View file

@ -50,6 +50,9 @@ obj-$(CONFIG_PPC_DCR) += dcr.o
obj-$(CONFIG_8xx) += mpc8xx_pic.o cpm1.o obj-$(CONFIG_8xx) += mpc8xx_pic.o cpm1.o
obj-$(CONFIG_UCODE_PATCH) += micropatch.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) ifeq ($(CONFIG_SUSPEND),y)
obj-$(CONFIG_6xx) += 6xx-suspend.o obj-$(CONFIG_6xx) += 6xx-suspend.o
endif endif

View file

@ -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);

View file

@ -694,7 +694,7 @@ mpc52xx_ata_probe(struct of_device *op, const struct of_device_id *match)
struct bcom_task *dmatsk = NULL; struct bcom_task *dmatsk = NULL;
/* Get ipb frequency */ /* Get ipb frequency */
ipb_freq = mpc52xx_find_ipb_freq(op->node); ipb_freq = mpc5xxx_get_bus_frequency(op->node);
if (!ipb_freq) { if (!ipb_freq) {
dev_err(&op->dev, "could not determine IPB bus frequency\n"); dev_err(&op->dev, "could not determine IPB bus frequency\n");
return -ENODEV; return -ENODEV;

View file

@ -197,7 +197,7 @@ int mpc_i2c_get_fdr_52xx(struct device_node *node, u32 clock, int prescaler)
return -EINVAL; return -EINVAL;
/* Determine divider value */ /* 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 * We want to choose an FDR/DFSR that generates an I2C bus speed that

View file

@ -1006,7 +1006,7 @@ mpc52xx_fec_probe(struct of_device *op, const struct of_device_id *match)
priv->phy_addr = FEC5200_PHYADDR_NONE; priv->phy_addr = FEC5200_PHYADDR_NONE;
priv->speed = 100; priv->speed = 100;
priv->duplex = DUPLEX_HALF; 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 */ /* the 7-wire property means don't use MII mode */
if (of_find_property(op->node, "fsl,7-wire-mode", NULL)) if (of_find_property(op->node, "fsl,7-wire-mode", NULL))

View file

@ -120,7 +120,7 @@ static int mpc52xx_fec_mdio_probe(struct of_device *of,
/* set MII speed */ /* set MII speed */
out_be32(&priv->regs->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); err = mdiobus_register(bus);
if (err) if (err)

View file

@ -76,7 +76,6 @@
#include <linux/of_platform.h> #include <linux/of_platform.h>
#include <asm/mpc52xx.h> #include <asm/mpc52xx.h>
#include <asm/mpc512x.h>
#include <asm/mpc52xx_psc.h> #include <asm/mpc52xx_psc.h>
#if defined(CONFIG_SERIAL_MPC52xx_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) #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 * but the generic serial code assumes 16
* so return ipb freq / 2 * 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 = { 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) 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 = { static struct psc_ops mpc512x_psc_ops = {

View file

@ -188,7 +188,7 @@ static int mpc5200_wdt_probe(struct of_device *op,
if (!wdt) if (!wdt)
return -ENOMEM; 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); err = of_address_to_resource(op->node, 0, &wdt->mem);
if (err) if (err)