powerpc/mpc5xxx: Switch mpc5xxx_get_bus_frequency() to use fwnode
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Sat, 7 May 2022 10:01:45 +0000 (13:01 +0300)
committerMichael Ellerman <mpe@ellerman.id.au>
Wed, 22 Jun 2022 02:51:49 +0000 (12:51 +1000)
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
arch/powerpc/include/asm/mpc5xxx.h
arch/powerpc/platforms/52xx/mpc52xx_gpt.c
arch/powerpc/sysdev/mpc5xxx_clocks.c
drivers/ata/pata_mpc52xx.c
drivers/i2c/busses/i2c-mpc.c
drivers/net/can/mscan/mpc5xxx_can.c
drivers/net/ethernet/freescale/fec_mpc52xx.c
drivers/net/ethernet/freescale/fec_mpc52xx_phy.c
drivers/net/ethernet/freescale/fs_enet/mii-fec.c
drivers/spi/spi-mpc52xx.c
drivers/tty/serial/mpc52xx_uart.c

index 2f60f5c..44db263 100644 (file)
 #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__ */
 
index 968f5b7..76ece60 100644 (file)
@@ -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;
index 834a6d7..c5bf7e1 100644 (file)
@@ -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);
index 03b6ae3..6559b60 100644 (file)
@@ -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;
index 6c698c1..81ac92b 100644 (file)
@@ -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;
 }
 
index 65ba669..c469b2f 100644 (file)
@@ -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;
 
index 5ddb769..a7f4c3c 100644 (file)
@@ -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);
index f85b5e8..95f778c 100644 (file)
@@ -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)
index 152f4d8..d37d7a1 100644 (file)
@@ -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");
index 3ebdce8..bc5e36f 100644 (file)
@@ -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;
index e50f069..3f1986c 100644 (file)
@@ -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;