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

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
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
@@ -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__ */
+1 −1
Original line number Diff line number Diff line
@@ -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;
+22 −19
Original line number Diff line number Diff line
// 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);
+1 −1
Original line number Diff line number Diff line
@@ -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;
+4 −3
Original line number Diff line number Diff line
@@ -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;
}

Loading