Commit de06fba6 authored by Andy Shevchenko's avatar Andy Shevchenko Committed by Michael Ellerman

powerpc/mpc5xxx: Switch mpc5xxx_get_bus_frequency() to use fwnode

Switch mpc5xxx_get_bus_frequency() to use fwnode in order to help
cleaning up other parts of the kernel from OF specific code.

No functional change intended.
Signed-off-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Acked-by: Chris Packham <chris.packham@alliedtelesis.co.nz> # for i2c-mpc
Acked-by: Wolfram Sang <wsa@kernel.org> # for the I2C part
Acked-by: default avatarMark Brown <broonie@kernel.org>
Acked-by: Marc Kleine-Budde <mkl@pengutronix.de> # for mscan/mpc5xxx_can
Acked-by: default avatarDamien Le Moal <damien.lemoal@opensource.wdc.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20220507100147.5802-2-andriy.shevchenko@linux.intel.com
parent 6d056b72
...@@ -11,7 +11,14 @@ ...@@ -11,7 +11,14 @@
#ifndef __ASM_POWERPC_MPC5xxx_H__ #ifndef __ASM_POWERPC_MPC5xxx_H__
#define __ASM_POWERPC_MPC5xxx_H__ #define __ASM_POWERPC_MPC5xxx_H__
extern unsigned long mpc5xxx_get_bus_frequency(struct device_node *node); #include <linux/property.h>
unsigned long mpc5xxx_fwnode_get_bus_frequency(struct fwnode_handle *fwnode);
static inline unsigned long mpc5xxx_get_bus_frequency(struct device *dev)
{
return mpc5xxx_fwnode_get_bus_frequency(dev_fwnode(dev));
}
#endif /* __ASM_POWERPC_MPC5xxx_H__ */ #endif /* __ASM_POWERPC_MPC5xxx_H__ */
...@@ -722,7 +722,7 @@ static int mpc52xx_gpt_probe(struct platform_device *ofdev) ...@@ -722,7 +722,7 @@ static int mpc52xx_gpt_probe(struct platform_device *ofdev)
raw_spin_lock_init(&gpt->lock); raw_spin_lock_init(&gpt->lock);
gpt->dev = &ofdev->dev; gpt->dev = &ofdev->dev;
gpt->ipb_freq = mpc5xxx_get_bus_frequency(ofdev->dev.of_node); gpt->ipb_freq = mpc5xxx_get_bus_frequency(&ofdev->dev);
gpt->regs = of_iomap(ofdev->dev.of_node, 0); gpt->regs = of_iomap(ofdev->dev.of_node, 0);
if (!gpt->regs) if (!gpt->regs)
return -ENOMEM; return -ENOMEM;
......
// SPDX-License-Identifier: GPL-2.0 // SPDX-License-Identifier: GPL-2.0
/**
* 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/kernel.h>
#include <linux/of_platform.h>
#include <linux/export.h> #include <linux/export.h>
#include <linux/property.h>
#include <asm/mpc5xxx.h> #include <asm/mpc5xxx.h>
unsigned long mpc5xxx_get_bus_frequency(struct device_node *node) /**
* mpc5xxx_fwnode_get_bus_frequency - Find the bus frequency for a firmware node
* @fwnode: firmware node
*
* Returns bus frequency (IPS on MPC512x, IPB on MPC52xx),
* or 0 if the bus frequency cannot be found.
*/
unsigned long mpc5xxx_fwnode_get_bus_frequency(struct fwnode_handle *fwnode)
{ {
const unsigned int *p_bus_freq = NULL; struct fwnode_handle *parent;
u32 bus_freq;
int ret;
of_node_get(node); ret = fwnode_property_read_u32(fwnode, "bus-frequency", &bus_freq);
while (node) { if (!ret)
p_bus_freq = of_get_property(node, "bus-frequency", NULL); return bus_freq;
if (p_bus_freq)
break;
node = of_get_next_parent(node); fwnode_for_each_parent_node(fwnode, parent) {
ret = fwnode_property_read_u32(parent, "bus-frequency", &bus_freq);
if (!ret)
return bus_freq;
} }
of_node_put(node);
return p_bus_freq ? *p_bus_freq : 0; return 0;
} }
EXPORT_SYMBOL(mpc5xxx_get_bus_frequency); EXPORT_SYMBOL(mpc5xxx_fwnode_get_bus_frequency);
...@@ -683,7 +683,7 @@ static int mpc52xx_ata_probe(struct platform_device *op) ...@@ -683,7 +683,7 @@ static int mpc52xx_ata_probe(struct platform_device *op)
struct bcom_task *dmatsk; struct bcom_task *dmatsk;
/* Get ipb frequency */ /* Get ipb frequency */
ipb_freq = mpc5xxx_get_bus_frequency(op->dev.of_node); ipb_freq = mpc5xxx_get_bus_frequency(&op->dev);
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;
......
...@@ -239,6 +239,7 @@ static const struct mpc_i2c_divider mpc_i2c_dividers_52xx[] = { ...@@ -239,6 +239,7 @@ static const struct mpc_i2c_divider mpc_i2c_dividers_52xx[] = {
static int mpc_i2c_get_fdr_52xx(struct device_node *node, u32 clock, static int mpc_i2c_get_fdr_52xx(struct device_node *node, u32 clock,
u32 *real_clk) u32 *real_clk)
{ {
struct fwnode_handle *fwnode = of_fwnode_handle(node);
const struct mpc_i2c_divider *div = NULL; const struct mpc_i2c_divider *div = NULL;
unsigned int pvr = mfspr(SPRN_PVR); unsigned int pvr = mfspr(SPRN_PVR);
u32 divider; u32 divider;
...@@ -246,12 +247,12 @@ static int mpc_i2c_get_fdr_52xx(struct device_node *node, u32 clock, ...@@ -246,12 +247,12 @@ static int mpc_i2c_get_fdr_52xx(struct device_node *node, u32 clock,
if (clock == MPC_I2C_CLOCK_LEGACY) { if (clock == MPC_I2C_CLOCK_LEGACY) {
/* see below - default fdr = 0x3f -> div = 2048 */ /* see below - default fdr = 0x3f -> div = 2048 */
*real_clk = mpc5xxx_get_bus_frequency(node) / 2048; *real_clk = mpc5xxx_fwnode_get_bus_frequency(fwnode) / 2048;
return -EINVAL; return -EINVAL;
} }
/* Determine divider value */ /* Determine divider value */
divider = mpc5xxx_get_bus_frequency(node) / clock; divider = mpc5xxx_fwnode_get_bus_frequency(fwnode) / 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
...@@ -266,7 +267,7 @@ static int mpc_i2c_get_fdr_52xx(struct device_node *node, u32 clock, ...@@ -266,7 +267,7 @@ static int mpc_i2c_get_fdr_52xx(struct device_node *node, u32 clock,
break; break;
} }
*real_clk = mpc5xxx_get_bus_frequency(node) / div->divider; *real_clk = mpc5xxx_fwnode_get_bus_frequency(fwnode) / div->divider;
return (int)div->fdr; return (int)div->fdr;
} }
......
...@@ -63,7 +63,7 @@ static u32 mpc52xx_can_get_clock(struct platform_device *ofdev, ...@@ -63,7 +63,7 @@ static u32 mpc52xx_can_get_clock(struct platform_device *ofdev,
else else
*mscan_clksrc = MSCAN_CLKSRC_XTAL; *mscan_clksrc = MSCAN_CLKSRC_XTAL;
freq = mpc5xxx_get_bus_frequency(ofdev->dev.of_node); freq = mpc5xxx_get_bus_frequency(&ofdev->dev);
if (!freq) if (!freq)
return 0; return 0;
......
...@@ -924,7 +924,7 @@ static int mpc52xx_fec_probe(struct platform_device *op) ...@@ -924,7 +924,7 @@ static int mpc52xx_fec_probe(struct platform_device *op)
/* Start with safe defaults for link connection */ /* Start with safe defaults for link connection */
priv->speed = 100; priv->speed = 100;
priv->duplex = DUPLEX_HALF; priv->duplex = DUPLEX_HALF;
priv->mdio_speed = ((mpc5xxx_get_bus_frequency(np) >> 20) / 5) << 1; priv->mdio_speed = ((mpc5xxx_get_bus_frequency(&op->dev) >> 20) / 5) << 1;
/* The current speed preconfigures the speed of the MII link */ /* The current speed preconfigures the speed of the MII link */
prop = of_get_property(np, "current-speed", &prop_size); prop = of_get_property(np, "current-speed", &prop_size);
......
...@@ -100,8 +100,7 @@ static int mpc52xx_fec_mdio_probe(struct platform_device *of) ...@@ -100,8 +100,7 @@ static int mpc52xx_fec_mdio_probe(struct platform_device *of)
dev_set_drvdata(dev, bus); dev_set_drvdata(dev, bus);
/* set MII speed */ /* set MII speed */
out_be32(&priv->regs->mii_speed, out_be32(&priv->regs->mii_speed, ((mpc5xxx_get_bus_frequency(dev) >> 20) / 5) << 1);
((mpc5xxx_get_bus_frequency(of->dev.of_node) >> 20) / 5) << 1);
err = of_mdiobus_register(bus, np); err = of_mdiobus_register(bus, np);
if (err) if (err)
......
...@@ -102,7 +102,7 @@ static int fs_enet_mdio_probe(struct platform_device *ofdev) ...@@ -102,7 +102,7 @@ static int fs_enet_mdio_probe(struct platform_device *ofdev)
struct resource res; struct resource res;
struct mii_bus *new_bus; struct mii_bus *new_bus;
struct fec_info *fec; struct fec_info *fec;
int (*get_bus_freq)(struct device_node *); int (*get_bus_freq)(struct device *);
int ret = -ENOMEM, clock, speed; int ret = -ENOMEM, clock, speed;
match = of_match_device(fs_enet_mdio_fec_match, &ofdev->dev); match = of_match_device(fs_enet_mdio_fec_match, &ofdev->dev);
...@@ -136,7 +136,7 @@ static int fs_enet_mdio_probe(struct platform_device *ofdev) ...@@ -136,7 +136,7 @@ static int fs_enet_mdio_probe(struct platform_device *ofdev)
} }
if (get_bus_freq) { if (get_bus_freq) {
clock = get_bus_freq(ofdev->dev.of_node); clock = get_bus_freq(&ofdev->dev);
if (!clock) { if (!clock) {
/* Use maximum divider if clock is unknown */ /* Use maximum divider if clock is unknown */
dev_warn(&ofdev->dev, "could not determine IPS clock\n"); dev_warn(&ofdev->dev, "could not determine IPS clock\n");
......
...@@ -437,7 +437,7 @@ static int mpc52xx_spi_probe(struct platform_device *op) ...@@ -437,7 +437,7 @@ static int mpc52xx_spi_probe(struct platform_device *op)
ms->irq0 = irq_of_parse_and_map(op->dev.of_node, 0); ms->irq0 = irq_of_parse_and_map(op->dev.of_node, 0);
ms->irq1 = irq_of_parse_and_map(op->dev.of_node, 1); ms->irq1 = irq_of_parse_and_map(op->dev.of_node, 1);
ms->state = mpc52xx_spi_fsmstate_idle; ms->state = mpc52xx_spi_fsmstate_idle;
ms->ipb_freq = mpc5xxx_get_bus_frequency(op->dev.of_node); ms->ipb_freq = mpc5xxx_get_bus_frequency(&op->dev);
ms->gpio_cs_count = of_gpio_count(op->dev.of_node); ms->gpio_cs_count = of_gpio_count(op->dev.of_node);
if (ms->gpio_cs_count > 0) { if (ms->gpio_cs_count > 0) {
master->num_chipselect = ms->gpio_cs_count; master->num_chipselect = ms->gpio_cs_count;
......
...@@ -1630,7 +1630,7 @@ mpc52xx_console_setup(struct console *co, char *options) ...@@ -1630,7 +1630,7 @@ mpc52xx_console_setup(struct console *co, char *options)
return ret; return ret;
} }
uartclk = mpc5xxx_get_bus_frequency(np); uartclk = mpc5xxx_fwnode_get_bus_frequency(of_fwnode_handle(np));
if (uartclk == 0) { if (uartclk == 0) {
pr_debug("Could not find uart clock frequency!\n"); pr_debug("Could not find uart clock frequency!\n");
return -EINVAL; return -EINVAL;
...@@ -1747,7 +1747,7 @@ static int mpc52xx_uart_of_probe(struct platform_device *op) ...@@ -1747,7 +1747,7 @@ static int mpc52xx_uart_of_probe(struct platform_device *op)
/* set the uart clock to the input clock of the psc, the different /* set the uart clock to the input clock of the psc, the different
* prescalers are taken into account in the set_baudrate() methods * prescalers are taken into account in the set_baudrate() methods
* of the respective chip */ * of the respective chip */
uartclk = mpc5xxx_get_bus_frequency(op->dev.of_node); uartclk = mpc5xxx_get_bus_frequency(&op->dev);
if (uartclk == 0) { if (uartclk == 0) {
dev_dbg(&op->dev, "Could not find uart clock frequency!\n"); dev_dbg(&op->dev, "Could not find uart clock frequency!\n");
return -EINVAL; return -EINVAL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment