mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	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 changed files with 44 additions and 34 deletions
				
			
		| 
						 | 
				
			
			@ -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 a new issue