forked from Minki/linux
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: Andy 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: Mark Brown <broonie@kernel.org> Acked-by: Marc Kleine-Budde <mkl@pengutronix.de> # for mscan/mpc5xxx_can Acked-by: Damien Le Moal <damien.lemoal@opensource.wdc.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/20220507100147.5802-2-andriy.shevchenko@linux.intel.com
This commit is contained in:
parent
6d056b7254
commit
de06fba62a
@ -11,7 +11,14 @@
|
||||
#ifndef __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__ */
|
||||
|
||||
|
@ -722,7 +722,7 @@ static int mpc52xx_gpt_probe(struct platform_device *ofdev)
|
||||
|
||||
raw_spin_lock_init(&gpt->lock);
|
||||
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);
|
||||
if (!gpt->regs)
|
||||
return -ENOMEM;
|
||||
|
@ -1,31 +1,34 @@
|
||||
// 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/of_platform.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/property.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);
|
||||
while (node) {
|
||||
p_bus_freq = of_get_property(node, "bus-frequency", NULL);
|
||||
if (p_bus_freq)
|
||||
break;
|
||||
ret = fwnode_property_read_u32(fwnode, "bus-frequency", &bus_freq);
|
||||
if (!ret)
|
||||
return bus_freq;
|
||||
|
||||
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)
|
||||
struct bcom_task *dmatsk;
|
||||
|
||||
/* Get ipb frequency */
|
||||
ipb_freq = mpc5xxx_get_bus_frequency(op->dev.of_node);
|
||||
ipb_freq = mpc5xxx_get_bus_frequency(&op->dev);
|
||||
if (!ipb_freq) {
|
||||
dev_err(&op->dev, "could not determine IPB bus frequency\n");
|
||||
return -ENODEV;
|
||||
|
@ -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,
|
||||
u32 *real_clk)
|
||||
{
|
||||
struct fwnode_handle *fwnode = of_fwnode_handle(node);
|
||||
const struct mpc_i2c_divider *div = NULL;
|
||||
unsigned int pvr = mfspr(SPRN_PVR);
|
||||
u32 divider;
|
||||
@ -246,12 +247,12 @@ static int mpc_i2c_get_fdr_52xx(struct device_node *node, u32 clock,
|
||||
|
||||
if (clock == MPC_I2C_CLOCK_LEGACY) {
|
||||
/* 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;
|
||||
}
|
||||
|
||||
/* 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
|
||||
@ -266,7 +267,7 @@ static int mpc_i2c_get_fdr_52xx(struct device_node *node, u32 clock,
|
||||
break;
|
||||
}
|
||||
|
||||
*real_clk = mpc5xxx_get_bus_frequency(node) / div->divider;
|
||||
*real_clk = mpc5xxx_fwnode_get_bus_frequency(fwnode) / div->divider;
|
||||
return (int)div->fdr;
|
||||
}
|
||||
|
||||
|
@ -63,7 +63,7 @@ static u32 mpc52xx_can_get_clock(struct platform_device *ofdev,
|
||||
else
|
||||
*mscan_clksrc = MSCAN_CLKSRC_XTAL;
|
||||
|
||||
freq = mpc5xxx_get_bus_frequency(ofdev->dev.of_node);
|
||||
freq = mpc5xxx_get_bus_frequency(&ofdev->dev);
|
||||
if (!freq)
|
||||
return 0;
|
||||
|
||||
|
@ -924,7 +924,7 @@ static int mpc52xx_fec_probe(struct platform_device *op)
|
||||
/* Start with safe defaults for link connection */
|
||||
priv->speed = 100;
|
||||
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 */
|
||||
prop = of_get_property(np, "current-speed", &prop_size);
|
||||
|
@ -100,8 +100,7 @@ static int mpc52xx_fec_mdio_probe(struct platform_device *of)
|
||||
dev_set_drvdata(dev, bus);
|
||||
|
||||
/* set MII speed */
|
||||
out_be32(&priv->regs->mii_speed,
|
||||
((mpc5xxx_get_bus_frequency(of->dev.of_node) >> 20) / 5) << 1);
|
||||
out_be32(&priv->regs->mii_speed, ((mpc5xxx_get_bus_frequency(dev) >> 20) / 5) << 1);
|
||||
|
||||
err = of_mdiobus_register(bus, np);
|
||||
if (err)
|
||||
|
@ -102,7 +102,7 @@ static int fs_enet_mdio_probe(struct platform_device *ofdev)
|
||||
struct resource res;
|
||||
struct mii_bus *new_bus;
|
||||
struct fec_info *fec;
|
||||
int (*get_bus_freq)(struct device_node *);
|
||||
int (*get_bus_freq)(struct device *);
|
||||
int ret = -ENOMEM, clock, speed;
|
||||
|
||||
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)
|
||||
}
|
||||
|
||||
if (get_bus_freq) {
|
||||
clock = get_bus_freq(ofdev->dev.of_node);
|
||||
clock = get_bus_freq(&ofdev->dev);
|
||||
if (!clock) {
|
||||
/* Use maximum divider if clock is unknown */
|
||||
dev_warn(&ofdev->dev, "could not determine IPS clock\n");
|
||||
|
@ -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->irq1 = irq_of_parse_and_map(op->dev.of_node, 1);
|
||||
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);
|
||||
if (ms->gpio_cs_count > 0) {
|
||||
master->num_chipselect = ms->gpio_cs_count;
|
||||
|
@ -1630,7 +1630,7 @@ mpc52xx_console_setup(struct console *co, char *options)
|
||||
return ret;
|
||||
}
|
||||
|
||||
uartclk = mpc5xxx_get_bus_frequency(np);
|
||||
uartclk = mpc5xxx_fwnode_get_bus_frequency(of_fwnode_handle(np));
|
||||
if (uartclk == 0) {
|
||||
pr_debug("Could not find uart clock frequency!\n");
|
||||
return -EINVAL;
|
||||
@ -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
|
||||
* prescalers are taken into account in the set_baudrate() methods
|
||||
* of the respective chip */
|
||||
uartclk = mpc5xxx_get_bus_frequency(op->dev.of_node);
|
||||
uartclk = mpc5xxx_get_bus_frequency(&op->dev);
|
||||
if (uartclk == 0) {
|
||||
dev_dbg(&op->dev, "Could not find uart clock frequency!\n");
|
||||
return -EINVAL;
|
||||
|
Loading…
Reference in New Issue
Block a user